2014-10-08 3 views
0

У меня есть представление, которое имеет много повторяющейся логики. Я не совсем уверен, как это сделать.Как высушить этот вид?

Любые идеи?

 <li><a href="#">Great Grandparents</a> 
     <ul> 
      <li><% if relative.humanize == "Great grandfather" || relative.humanize == "Great grandmother" %> 
      <%= link_to image_tag(membership.user.avatar.url, size: "48x48", :class => "img-circle") , family_tree_path(membership.user.family_tree) %> 
       <%= link_to membership.user.name, family_tree_path(membership.user.family_tree)%> 
       <% else %> 
       None added yet, add them <%= link_to 'here', "#" , class: 'btn invite popupbox','data-popup' => 'invite_friend' %> 
      <% end %> 
      </li> 
     </ul> 
     </li> 
     <li><a href="#">Grandparents</a> 
     <ul> 
      <li><% if relative.humanize == "Grandfather" || relative.humanize == "Grandmother" %> 
      <%= link_to image_tag(membership.user.avatar.url, size: "48x48", :class => "img-circle") , family_tree_path(membership.user.family_tree) %> 
       <%= link_to membership.user.name, family_tree_path(membership.user.family_tree)%> 
       <% else %> 
       None added yet, add them <%= link_to 'here', "#" , class: 'btn invite popupbox','data-popup' => 'invite_friend' %> 
      <% end %> 
      </li> 
     </ul> 
     </li> 
     <li><a href="#">Parents</a> 
     <ul> 
      <li><% if relative.humanize == "Mom" || relative.humanize == "Dad" %> 
      <%= link_to image_tag(membership.user.avatar.url, size: "48x48", :class => "img-circle") , family_tree_path(membership.user.family_tree) %> 
       <%= link_to membership.user.name, family_tree_path(membership.user.family_tree)%> 
       <% else %> 
       None added yet, add them <%= link_to 'here', "#" , class: 'btn invite popupbox','data-popup' => 'invite_friend' %> 
      <% end %> 
      </li> 
     </ul> 

     </li> 

Примечание: Выше был усечен, есть более, по крайней мере 7. Существует много повторений, но я не совсем уверен, как высушить его с помощью Railsy.

+0

Как членство и родственник связаны друг с другом? – Surya

ответ

2

По вашему мнению сделать:

<% relatives_sections = [ 
    { section_name: 'Great grandparents', human_names: ['Great grandfather', 'Great grandmother']}, 
    { section_name: 'Grandparents', human_names: ['Grandfather', 'Grandmother']}, 
    { section_name: 'Parents', human_names: ['Mom', 'Dad']}, 
    ... 
] %> 

<% relatives_sections.each do |section| %> 
<li><a href="#"><%= section[:section_name] %></a> 
    <ul> 
    <li> 
     <% if section[:human_names].include?(relative.humanize) %> 
     <%= link_to image_tag(membership.user.avatar.url, size: "48x48", :class => "img-circle") , family_tree_path(membership.user.family_tree) %> 
     <%= link_to membership.user.name, family_tree_path(membership.user.family_tree)%> 
     <% else %> 
     None added yet, add them <%= link_to 'here', "#" , class: 'btn invite popupbox','data-popup' => 'invite_friend' %> 
     <% end %> 
    </li> 
    </ul> 
</li> 
<% end %> 

Вы также можете переместить весь <li> блок к _relatives.html.erb парциальное, который содержит

<li><a href="#"><%= section_name %></a> 
    <ul> 
    <li> 
     <% if human_names.include?(relative.humanize) %> 
     <%= link_to image_tag(user.avatar.url, size: "48x48", :class => "img-circle") , family_tree_path(user.family_tree) %> 
     <%= link_to user.name, family_tree_path(user.family_tree)%> 
     <% else %> 
     None added yet, add them <%= link_to 'here', "#" , class: 'btn invite popupbox','data-popup' => 'invite_friend' %> 
     <% end %> 
    </li> 
    </ul> 
</li> 

Тогда, на ваш взгляд:

<% common_vars = {user: membership.user, relative:relative} %> 
<% relatives_sections.each do |section| %> 
    <%= render partial: 'relatives', locals: section.merge(common_vars) %> 
<% end %> 

И в качестве последнего шага вы можете рассмотреть возможность перемещения relative_sections в помощник, а затем, если это возможно, сушить его там.

Смежные вопросы