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

时间:2012-07-02 19:53:20

标签: jquery ruby-on-rails

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

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

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

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

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

3 个答案:

答案 0 :(得分:2)

老实说,似乎link you mentioned 的选项1是最多" Rails方式"这样做。您创建了一个名为View的模型,其中包含item_iduser_id。我说最重要的是制作View资源。

更新:因此,如果用户已访问该项目的Items#show,请假设您要将项目标记为已查看。这很简单 - 在Items#show之前,在您呈现该网页的视图之前,请执行以下操作:

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

如果您担心current_user未登录或类似内容,您可以before_filter Items#show登录用户(如果您需要)在他查看项目之前他被记录)或只是有条件地创建view

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

答案 1 :(得分:0)

在索引中使用的表中添加一个新列并将其命名为

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

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

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

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

答案 2 :(得分:0)

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

如果你真的开始使用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中实现它的一种方法。不能保证它是最有效的。