0

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

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

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

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

我可以依赖浏览器并使用适当的 CSS 来设置已访问和未访问 URL 的样式,但出于与我的项目相关的其他原因(但不是这个问题,真的),我宁愿有一个依赖 Rails、钩子和/的解决方案或数据库。如果没有直接的 Rails 方法可以做到这一点,我也支持其他解决方案(例如,基于 jQuery 的)。

4

3 回答 3

2

老实说,您提到 的链接的选项 1 似乎最“Rails 方式”。您制作了一个名为 a 的模型View,其中包含 aitem_id和 a 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
于 2012-07-02T20:00:38.113 回答
0

向索引中使用的表添加一个新列并调用它查看

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

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

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

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

于 2012-07-02T20:03:30.203 回答
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 中实现的一种方法。不能保证它是最有效的。

于 2012-07-02T20:04:20.610 回答