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_id
和user_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中实现它的一种方法。 不能保证它是最有效的。