Как я могу превратить три части в одну в рельсах, где: collection одинакова? - PullRequest
0 голосов
/ 29 мая 2010

У меня есть три части, которые я хотел бы объединить в одну. Они совместно используют одну и ту же коллекцию, но каждый получает свою собственную локальную переменную. Эти переменные используются для конкретных моделей, поэтому в результате у меня есть три разных вызова частичных и три различных частичных.

Вот повторяющийся код:

<% for email in campaign.emails %>
      <h4><%= link_to email.title, email  %> <%= email.days %> days</h4>

         <% @contacts= campaign.contacts.find(:all, :order => "date_entered ASC" )%> <!--contacts collection-->   

         <!-- render the information for each contact -->
         <%= render :partial => "contact_email",
                    :collection => @contacts,
                    :locals => {:email => email} %>
    <% end %>

       Calls in this Campaign:
       <% for call in campaign.calls %>
          <h4><%= link_to call.title, call  %> <%= call.days %> days</h4>
          <% @contacts= campaign.contacts.find(:all, :order => "date_entered ASC" )%> <!--contacts collection-->      
         <!-- render the information for each contact -->
         <%= render :partial => "contact_call",
                    :collection => @contacts,
                    :locals => {:call => call} %>
       <% end %>

       Letters in this Campaign:
       <% for letter in campaign.letters %>
          <h4><%= link_to letter.title, letter  %> <%= letter.days %> days</h4>
          <% @contacts= campaign.contacts.find(:all, :order => "date_entered ASC" )%> <!--contacts collection-->      
         <!-- render the information for each contact -->
         <%= render :partial => "contact_letter",
                    :collection => @contacts,
                    :locals => {:letter => letter} %>
       <% end %>

Пример одной из частичек выглядит следующим образом:

<</p>

div id="contact_email_partial">
 <% if from_today(contact_email, email.days) < 0 %>
       <% if show_status(contact_email, email) == 'no status'%>
            <p> <%= full_name(contact_email) %>
                <% unless contact_email.statuses.empty?%>
                    (<%= contact_email.statuses.find(:last).status%>) 
                 <% end %>
                is <%= from_today(contact_email,email.days).abs%> days overdue:
                <%= do_event(contact_email, email) %>

                <%= link_to_remote "Skip Email Remote",
                                  :url => skip_contact_email_url(contact_email,email),
                                  :update => "update-area-#{contact_email.id}-#{email.id}" %>
                <span id='update-area-<%="#{contact_email.id}-#{email.id}"%>'> </span>
        <% end %>
     <% end %>
</div>

А вот и другая частичная ... похожая, а? Нужна помощь, чтобы она СУХАЯ!

 <% if (from_today(contact_call, call.days) < 0) %>
       <% if show_status(contact_call, call) == 'no status'%>
            <p> <%= full_name(contact_call) %> 
                 <% unless contact_call.statuses.empty?%>
                    (<%= contact_call.statuses.find(:last).status%>) 
                 <% end %>
                is <%= from_today(contact_call,call.days).abs%> days overdue:
                <%= do_event(contact_call, call) %>
                <%= contact_call.phone %>
            </p>
        <% end %>
     <% end %>

1 Ответ

0 голосов
/ 29 мая 2010

Для локальных переменных ключ, который вы выбираете при передаче хеша localals, является именем, которое переменная будет иметь в частичном. Таким образом, вы можете сделать это в своем повторяющемся коде:

<% for email in campaign.emails %>

  <h4><%= link_to email.title, email  %> <%= email.days %> days</h4>

     <% @contacts= campaign.contacts.find(:all, :order => "date_entered ASC" )%> <!--contacts collection-->   

     <!-- render the information for each contact -->
     <%= render :partial => "contact",
                :collection => @contacts,
                :locals => {:objt => email, 
                            :url_method => "skip_#{class}_url".to_sym } %>
<% end %>

   Calls in this Campaign:
   <% for call in campaign.calls %>
      <h4><%= link_to call.title, call  %> <%= call.days %> days</h4>
      <% @contacts= campaign.contacts.find(:all, :order => "date_entered ASC" )%> <!--contacts collection-->      
     <!-- render the information for each contact -->
     <%= render :partial => "contact",
                :collection => @contacts,
                :locals => {:objt => call,
                            :url_method => "skip_#{class}_url".to_sym } %>
   <% end %>

   Letters in this Campaign:
   <% for letter in campaign.letters %>
      <h4><%= link_to letter.title, letter  %> <%= letter.days %> days</h4>
      <% @contacts= campaign.contacts.find(:all, :order => "date_entered ASC" )%> <!--contacts collection-->      
     <!-- render the information for each contact -->
     <%= render :partial => "contact",
                :collection => @contacts,
                :locals => {:objt => letter,
                            :url_method => "skip_#{class}_url".to_sym } %>

   <% end %>

Поскольку в частичной части мы на самом деле не знаем класс объекта, который нам нужно визуализировать, я создаю символ, представляющий метод, который необходимо вызвать для создания URL-адреса. Мы запустим это частично, используя бит send magic.

Обратите внимание, что частичное было переименовано просто в "contact" (_contact.html.erb), и я назначаю электронную почту, вызов и письмо по очереди переменной objt, которая будет доступна из частичного.

Для частичного (_contact.html.erb):

<div id="contact_partial">
 <% if from_today(contact, objt.days) < 0 %>
       <% if show_status(contact, objt) == 'no status'%>
            <p> <%= full_name(contact) %>
                <% unless contact.statuses.empty?%>
                    (<%= contact.statuses.find(:last).status%>) 
                 <% end %>
                is <%= from_today(contact,objt.days).abs%> days overdue:
                <%= do_event(contact, objt) %>

                <%= link_to_remote "Skip Email Remote",
                                  :url => send(url_method,contact,objt), 
                                  :update => "update-area-#{contact.id}-#{objt.id}" %>
                <span id='update-area-<%="#{contact.id}-#{objt.id}"%>'> </span>
        <% end %>
     <% end %>
</div>

Обратите внимание, что вместо непосредственного вызова метода skip_email_url мы используем «send» для вызова метода, указанного в первом параметре (в данном случае, url_method, локальный элемент, передаваемый из вызывающего представления), и далее мы передаем Метод дополнительных параметров (в этом случае контакт и объект). Просто убедитесь, что метод, указанный в url_method, действительно принимает два параметра.

...