从视图中重构代码

时间:2011-06-20 10:26:35

标签: ruby-on-rails view refactoring helpers

我有以下显示事件的视图代码,以及通知用户今天,昨天或过去一周发生以下事件的标题。

一切正常,但我更愿意将其重构为视图,我不能把它放在帮助器中,因为它需要在循环迭代之间维护变量状态。知道怎么整理这个吗?感谢

<% 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条

昨天的事件
苏创造了一篇新文章

过去一周的事件
卡罗尔被提拔了 丹辞去了一篇新文章

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) %>

_events.html.erb

<% if events.present? %>
  <%= title %>
  <% events.each do |event| %>
    <%= event.title %>
  <% end %>
<% end %>

应用程序/助手/ event_display_helper.rb

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