我有以下显示事件的视图代码,以及通知用户今天,昨天或过去一周发生以下事件的标题。
一切正常,但我更愿意将其重构为视图,我不能把它放在帮助器中,因为它需要在循环迭代之间维护变量状态。知道怎么整理这个吗?感谢
<% displayed_week_already = false %>
<% displayed_yesterday_already = false %>
<% displayed_today_already = false %>
<% @events.each do |event| %>
<%= event.title &>
<% if (Time.now - 1.week) > event.created_at && !displayed_week_already %>
<% displayed_week_already = true %>
Events in past week
<% elsif (Time.now - 1.day) > event.created_at && (Time.now - 2.day) < event.created_at && !displayed_yesterday_already %>
<% displayed_yesterday_already = true %>
Events yesterday
<% elsif (Time.now - 1.day) < event.created_at && !displayed_today_already %>
<% displayed_today_already = true %>
Events in past day
<% end %>
<% end %>
预期输出为:
过去一天的活动
约翰创造了一个新的艺术品
丹评论了第1条
苏删了第2条
昨天的事件
苏创造了一篇新文章
过去一周的事件
卡罗尔被提拔了
丹辞去了一篇新文章
答案 0 :(得分:1)
您可以在模型中轻松完成此操作,使用命名范围(我假设Rails 3,因为这是我最熟悉的)。你需要自己定义它们,但它们非常简单。
@last_week = @event.last_week
@yesterday = @event.yesterday
@today = @event.today
然后只迭代视图中的每个组。应该让它更清洁,你不需要那么多的逻辑,因为它实际上属于它。
答案 1 :(得分:1)
我可能会做类似以下的事情。我遗漏了模型本身定义的已实现方法。
<%= render "events", :title => "Events in past day", :events => from_today(@events) %>
<%= render "events", :title => "Events yesterday", :events => from_yesterday(@events) %>
<%= render "events", :title => "Events in past week", :events => from_this_week(@events) %>
<% if events.present? %>
<%= title %>
<% events.each do |event| %>
<%= event.title %>
<% end %>
<% end %>
module EventDisplayHelper
def from_today(events)
events.select{|x| x.happened_today?}
end
def from_yesterday(events)
events.select{|x| x.happened_yesterday?}
end
def from_this_week(events)
events.select{|x| x.happened_this_week_before_yesterday?}
end
end