Рефакторинг кода вне поля зрения - PullRequest
0 голосов
/ 20 июня 2011

У меня есть следующий код представления, который отображает события вместе с заголовками, информирующими пользователя, произошли ли следующие события сегодня, вчера или на прошлой неделе.

Все это прекрасно работает, но я бы предпочел реорганизовать его вне поля зрения, я не могу поместить его в помощник, потому что он должен поддерживать состояние переменных между циклами итераций. Любая идея, как привести в порядок это? спасибо

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

1 голос
/ 22 ноября 2011

Я мог бы сделать что-то вроде следующего. Я опускаю реализованные методы, определенные в самой модели.

существующий вид

<%= 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
1 голос
/ 20 июня 2011

Вы могли бы легко сделать это в модели с именованными областями (я предполагаю, что Rails 3, потому что это то, что я знаю лучше всего). Вам нужно определить их самостоятельно, но они довольно просты.

@last_week = @event.last_week
@yesterday = @event.yesterday
@today = @event.today

Затем просто переберите каждую из групп в вашем представлении. Должно сделать его намного чище, и вам не понадобится так много логики, поскольку это то, к чему оно фактически относится.

...