我想根据用户之前是否查看过与该控制器关联的记录来修改控制器index.html.erb
页面的内容。
在我的特定情况下,我有一个Item模型,Items控件和一个Items视图。项目视图index.html.erb
显示每个项目的链接。我需要设置此视图,以便如果之前已查看某个项目,则index.html.erb
上的链接将以斜体显示。如果没有查看,链接将以粗体显示。
从视觉上看,此方法类似于电子邮件收件箱,其中未查看的项目的主题标题以粗体列出,而查看的项目具有常规字体粗细。
我的问题类似于previous stack overflow post;但是,该帖子提供了与数据库结构相关的一般答案。我很想知道是否有“Rails方式”来实现我所缺少的这种行为。如果链接的帖子合适,任何人都可以提供有关如何使用Rails实现帖子推荐解决方案的建议吗?
我可以依赖浏览器并使用适当的CSS来设置访问和未访问的URL的样式,但出于与我的项目相关的其他原因(但实际上不是这个问题)我宁愿有一个依赖于Rails,钩子的解决方案和/或数据库。如果没有简单的Rails方法,我也会选择其他解决方案(例如,基于jQuery)。
答案 0 :(得分:2)
老实说,似乎link you mentioned 的选项1是最多" Rails方式"这样做。您创建了一个名为View
的模型,其中包含item_id
和user_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中实现它的一种方法。不能保证它是最有效的。