Для локальных переменных ключ, который вы выбираете при передаче хеша 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, действительно принимает два параметра.