我有一个应用程序,它有几个部分,如新闻、帖子、工作、事件等。所有这些都通过有效的注册/登录系统完成。
新闻部分显示所有可供查看的新闻,并有一个小div显示最近的活动
最近的活动div 应该只显示当前用户在该会话中看到的最后 5 条新闻。
我设法显示了当前用户看到的最后 5 个 URL,但我想将其限制为仅新闻控制器。
class ApplicationController < ActionController::Base
before_filter :store_recent_news
private
def store_recent_news
session[:recents] ||= []
session[:recents].delete_at(0) if session[:recents].size >= 5
session[:recents] << request.url
end
在最近的活动div 中,我只会显示最后 5 条新闻现在我显示一个这样的列表:
-本地主机:3000/新闻/17
-本地主机:3000/新闻
-本地主机:3000/工作/29
-本地主机:3000/个
-本地主机:3000/目录
我只想显示当前用户看到的最后新闻的链接,例如
链接到新闻2
新闻链接5
链接到新闻3
我希望我能清楚地知道问题是什么以及我想做什么。
好的,我设法获得了当前用户访问的最后 5 条新闻的 ID
before_filter :recently_viewed, only: [:show, :index]
def recently_viewed
(session[:Directory_id] ||= []) << params[:id]
session[:Directory_id].delete_at(0) if session[:Directory_id].size >= 10
end
现在我设法显示当前用户在会话中访问过的新闻的最后 5 个 ID,但我需要将新闻的名称显示为链接。 有什么想法吗?
您应该在新闻模型中创建一个范围:
http://guides.rubyonrails.org/active_record_querying.html#scopes
scope :recent_news, order("created_at desc").limit(5)
然后,在您的news_controller
中,无论您需要执行什么操作,您都可以访问此自定义查询:
def index
# whatever
@recent_news = News.recent_news
end
然后,您可以在相应的视图中使用实例变量。
before_filter :recently_viewed_contacts
def recently_viewed_contacts
session[:New_id] ||= []
session[:New_id] << params[:id] unless params[:id].nil?
session[:New_id].delete_at(0) if session[:News_id].size >= 4
end
所以我弄清楚了如何使用相同的数组方法来做到这一点,只需更改参数以仅检查新闻匹配的 id,并通过刷新或检查与新闻不同的其他视图对 nil 进行一些更正。
def index
@recent_news = session[:News_id]
@news = User.approved.order(:name).page(params[:page]).per(8)
end
并使用新数组显示用户最近访问的 5 条新闻的标题
<% @recent_news.each do |recent| %>
<p><%= New.find(recent).title %></p>
<% end %>