Rails:如何干燥部分的多次使用

Rails: How to DRY up multiple use of a partial

想干一下下面的代码。创建了部分 _user.html.erb,由 users 视图通过

调用
  1. <%= render @users %>

并由查看来自

  1. <%= render partial: 'users/user', collection: @mailgroup.users, as: :user %>

部分_user.html.erb是:

<%= content_tag_for(:tr, user) do %>
  <td><%= user.id %></td>
  <td><%= check_box_tag "user_ids[]", user.id, true %></td>
  <td><%= user.firstname %></td>
  <td><%= user.lastname %></td>
  <td><%= user.function %></td>
  <td><%= user.company %></td>
  <td><%= user.appendix %></td>
  <td><%= user.city %></td> 
  <td>
    <%= link_to button1 ...     %>
    <%= link_to button2 ...     %>
    <%= link_to button3 ...     %>
    <%= link_to button4 ...     %>    
  </td>
<% end %>

现在我喜欢这个局部渲染了一次所有列(调用 1.),还渲染了一部分列(调用 2.)。特别喜欢隐藏第二栏的check_box_tag

我四处寻找,最后很困惑如何解决:不同的布局?我将如何处理部分问题?或者首先检查呼叫来自哪个控制器? (这听起来不太令我满意)。

一般情况:如何在不维护该部分的不同副本的情况下调用具有不同列子集的相同部分?

我不确定您是否可以使用部分布局,我同意检查控制器源是一种代码味道。我会考虑使用另一个本地来检查是否要显示可以在 "calling" 视图中设置的字段,例如

<%= render @users, locals: {show_buttons: false} %>

<%= render partial: 'users/user', collection: @mailgroup.users, as: :user, show_buttons: true %>

并在用户部分使用

<% if show_buttons %>
  <td><%= check_box_tag "user_ids[]", user.id, true %></td>
<% end %>

你可以用辅助方法进一步干燥它

<td><%= user.id %></td>
<%= check_box(user, show_buttons)

module UsersHelper

  def check_box(user, show_buttons)
    if show_buttons
      content_tag(:td) do
        content_tag(:option, "user_ids[]", value: user.id )
      end
    end
  end

end