Rails 3:确定用户是否查看过数据

我想根据用户以前是否查看过与该控制器关联的记录来修改控制器index.html.erb页面的内容。

在我的特定情况下,我有一个Item模型,Items控件和一个Items视图。 Item的视图index.html.erb显示每个Item的链接。 我需要设置此视图,以便如果先前已查看某个项目,则其index.html.erb链接将以斜体显​​示。 如果没有查看,链接将以粗体显示。

在视觉上,此方法类似于电子邮件收件箱,其中未查看的项目的主题标题以粗体列出,而查看的项目具有常规字体粗细。

我的问题类似于之前的堆栈溢出post ; 但是,该post提供了与数据库结构相关的一般答案。 我很想知道是否有一种”Rails方式’来实现我所缺少的这种行为。 如果链接的post合适,任何人都可以提供有关如何使用Rails实现post推荐解决方案的建议吗?

我可以依赖浏览器并使用适当的CSS来设置访问和未访问的URL的样式,但出于与我的项目相关的其他原因(但实际上不是这个问题)我宁愿有一个依赖于Rails,hooks和/的解决方案或数据库。 如果没有简单的Rails方法,我也会选择其他解决方案(例如,基于jQuery)。

老实说, 你提到的链接的选项1似乎最“Rails方式”。 您创建一个名为View的模型,它具有item_iduser_id 。 我要说最重要的是创建一个View资源。

更新:因此,如果用户已访问该项目的项目#show,则假设您要将项目标记为已查看。 这很容易 – 在Items#show ,在渲染该页面的视图之前,执行以下操作:

 View.create(item_id: params[:id], user_id: current_user.id) 

如果你担心current_user没有登录或类似的东西,你可以在Items#show上创建一个before_filter来记录用户(如果你需要在他查看项目之前记录他)或者只是创建view有条件的:

 if current_user View.create(item_id: params[:id], user_id: current_user.id) end 

将新列添加到索引中使用的表并调用它

呈现页面后,将行的已查看列设置为true或1

下次加载页面时,您将检查是否已使用该列查看然后显示为斜体,然后呈现页面然后设置新行 – 即所有行都为true

– 诀窍是在渲染页面后更新你的行 –

插入新记录时,您将插入列视图为false – 未查看

如果您只希望链接在每个会话的基础上更改,您可以执行此操作…

如果你真的开始使用rails,你可以在会话中存储一个变量来检查页面是否被访问过。 就像是

session["visited_hash"]["name_of_page_or_whatever"] = true

然后在索引页面上

 if session["visited_hash"]["name_of_page_or_whatever"] == true #render link with special formatting else #render normally 

说实话,我可能会在CSS中实现它,但这是在rails中实现它的一种方法。 不能保证它是最有效的。