У меня есть шаблон в нескольких шаблонах, который повторяется. Код предназначен для отображения набора вкладок и содержимого для каждой вкладки.
Содержимое /app/views/general/_product_groupings.html.erb
<table cellpadding="1" cellspacing="0" class="sub_container clear">
<tr>
<% first_visible_tab = true %>
<% @bundle.groupings.each do |group| %>
<td id="tab_heading_for_group_<%= group.id %>" class="tab_heading <%= 'selected' if first_visible_tab %>" onclick="show_tab('product_type_<%= group.id %>')"><%= one_liner(group.name) %></td>
<td></td>
<% first_visible_tab = false %>
<% end %>
<td class="last"></td>
</tr>
<tr>
<td colspan="99" class="tab_content">
<% first_visible_tab = true %>
<%# groupings is an array of products %>
<% @bundle.groupings.each do |group| %>
<div style="display: <%= (first_visible_tab) ? '' : 'none' %>" id="tab_body_for_group_<%= group.id %>" class="tab_body container_inner">
<% first_visible_tab = false %>
<% template = case group.grouping_type
when 'selection'
:product_selection_group
when 'group'
:product_optional_group
when 'product'
:product_optional_group
end %>
<%= render :partial => template.to_s, :locals => {:group => group} %>
</div>
<% end %>
</td>
<tr>
</table>
Код состоит из нескольких частей. Передается общий параметр, @bundle
. Раздел заголовка (строки 1-10):
<table cellpadding="1" cellspacing="0" class="sub_container clear">
<tr>
<% first_visible_tab = true %>
<% @bundle.groupings.each do |group| %>
<td id="tab_heading_for_group_<%= group.id %>" class="tab_heading <%= 'selected' if first_visible_tab %>" onclick="show_tab('product_type_<%= group.id %>')"><%= one_liner(group.name) %></td>
<td></td>
<% first_visible_tab = false %>
<% end %>
<td class="last"></td>
</tr>
В разделе заголовка есть части, которые отличаются каждым кодом места, как это используется: коллекция повторяется, @bundle.groupings
. Параметр для show_tab()
onclick. Идентификатор вкладки id="tab_heading_for_group_<%= group.id %>"
.
Ниже заголовка есть область, которую, я считаю, можно получить как блок, реальное содержимое каждой области содержимого вкладки (строки 19-27):
<% template = case group.grouping_type
when 'selection'
:product_selection_group
when 'group'
:product_optional_group
when 'product'
:product_optional_group
end %>
<%= render :partial => template.to_s, :locals => {:group => group} %>
Чуть выше содержимого - та же коллекция @bundle.groupings.each do ...
, повторенная из заголовка.
Я бы очень хотел высушить это. Определив блок с содержимым, которое можно получить внутри вспомогательного метода.
Я думаю, что этот метод должен принимать следующие параметры:
- id_template
- onclick_method # возможно с шаблоном для параметра метода onclick
- коллекция
- блок для выдачи в области содержимого вкладки
Вопрос в том, как создать вспомогательный метод для получения как блока, так и параметров?