Как я могу осуществить рефакторинг необходимость в так многих для циклов в направляющих?

Я нуждаюсь в помощи, осуществляя рефакторинг эту многоконтурную вещь. Вот то, что я имею:

Кампания has_many Контакты
Кампания также имеет много Моделей, которые являются шаблонами: (электронная почта, Вызов и Буква).

Поскольку я ищу запоздалый на каждом, я создал массив под названием Событие, которое я хотел бы циклично выполнить через это, содержит ['электронную почту', 'звоните', 'буква'].

Мне нужен список всех электронных писем, Вызовов и Букв, которые являются "запоздалыми" для каждого Контакта, который принадлежит Кампании. Запоздалый определяется from_today методом, который смотрит на дату, Контакт вводился в систему и количество дней, которое должно передать для любого данного События. from_today () производит количество дней с сегодняшнего дня, что Событие должно быть сделано для данного Контакта.

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

Не было уверено, где начать: named_scope, продвиньте некоторые вещи в метод, и так далее, или - минимум мочь динамично изменить имена классов так, по крайней мере, он циклично выполняется три раза через различные события вместо того, чтобы повторить код три раза:

<% @campaigns.each do |campaign| %>
   <h2><%= link_to campaign.name, campaign %></h2>

   <% @events.each do |event| %>
       <%= event %>
       <% for email in campaign.emails %>
          <h4><%= link_to email.title, email  %> <%= email.days %> days</h4>

          <% for contact in campaign.contacts.find(:all, :order => "date_entered ASC" ) %>
             <% if (from_today(contact, email.days) < 0) %>
                <% if show_status(contact, email) == 'no status'%>
                    <p> <%= full_name(contact) %> 
                        is <%= from_today(contact,email.days).abs%> days overdue:
                        <%= do_event(contact, email) %>
                    </p>
                <% end %>
             <% end %>
          <% end %>
       <% end %>
     <% end %>
<% end %>
1
задан Timothy T. 15 May 2010 в 15:08
поделиться

2 ответа

Чтобы добавить к ответу Патрика, я бы также использовал параметр: collection render , чтобы упростить это немного дальше, например иметь частичный _contact.html.erb для рендеринга каждого контакта:

<% if (from_today(contact, email.days) < 0) %>
    <% if show_status(contact, email) == 'no status'%>
      <p> <%= full_name(contact) %> 
          is <%= from_today(contact,email.days).abs%> days overdue:
          <%= do_event(contact, email) %>
      </p>
    <% end %>
  <% end %>
<% end %>

, а затем рендерить коллекцию contacts с помощью

= render :partial => "contact", :collection => @contacts

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

1
ответ дан 3 September 2019 в 00:31
поделиться

Я бы поместил вывод для каждого ресурса в partial, примерно так:

<% @campaigns.each do |campaign| %>
  <h2><%= link_to campaign.name, campaign %></h2>
  <%= render 'events', :events => campaign.events %>
<% end %>

затем в app/views/campaigns/_events.html.erb

<% events.each do |event| %>
  <%= event %>
  <%= render 'emails', :emails => event.emails %>
<% end %>

затем в app/views/campaigns/_emails.html. erb

<% emails.each do |email| %>
  <h4><%= link_to email.title, email  %> <%= email.days %> days</h4>
  <%= render 'contacts', :contacts => email.contacts.all(:order => "date_entered ASC", :email => email) %>
<% end %>

затем в app/views/campaigns/_contacts.html.erb

<% contacts.each do |contact| %>
  <% if (from_today(contact, email.days) < 0) %>
    <% if show_status(contact, email) == 'no status'%>
      <p> <%= full_name(contact) %> 
          is <%= from_today(contact,email.days).abs%> days overdue:
          <%= do_event(contact, email) %>
      </p>
    <% end %>
  <% end %>
<% end %>
1
ответ дан 3 September 2019 в 00:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: