如何使部分代码仅针对特定集合显示

How to make partial show some code only for specific collection

我在不同集合的视图中两次使用相同的部分。这有效:

<%= render partial: 'organizations/organization', collection: @organizations %>
<%= render partial: 'organizations/organization', collection: @members %>

但部分部分我只希望在 @members 集合中显示。是否有一些语法使这成为可能?所以基本实现的东西:

# Inside parial:
<% if collection: @members %>
  <td><%= organization.fish %></td>
<% end %>

背景:在users controller我有(@membersorganizations可能部分重叠,所以在部分我不认为可以根据后面的内容来区分=; 相反,如果可能的话,有必要根据哪个集合来区分部分(在 = 传递给部分之前):

def show
  @user = User.friendly.find(params[:id])
  @members = @user.organizations.where('member = ?', true)
  @organizations = @user.organizations.where('moderator = ?', true)
  ...
end

或者我可以在渲染一个键的部分传递时,然后在部分中如果那个键是 true 它只会显示一段代码吗?

假设@members 是Member 的集合。你可以这样做

<% if organization.member %>
  <td><%= organization.fish %></td>
<% end%>

我建议您使用 "duck typing" 并在您的模型上添加一个方法来确定它是什么类型的实例,而不是在循环的每次迭代中检查类型:

从问题中获取更多信息后进行调整

class Organization

  def organization_type
     # your logic to set or determine whether it is an organization or a member
     return "member" if member?
     return "moderator" if moderator?
     "organization"
  end

end

然后在你的部分:

<% if organization.organization_type == "member" %>
  <td><%= organization.fish %></td>
<% end %>

这只是关于如何完成的粗略想法。在这种情况下,您甚至可以将对象的混合集合传递给您的部分,如果每个模型都在其中定义了 organization_type,它将正确显示。

评论后

 <%= render partial: 'organizations/organization', collection: @members, member_flag: true %>

在你的部分:

<% if local_assigns[:member_flag] && member_flag %>
  <td><%= organization.fish %></td>
<% end %>

第三次尝试

# Per @Nick's correction in his comment about locals.

<%= render partial: 'organizations/organization', collection: @organizations, locals: { member_flag: false } %>
<%= render partial: 'organizations/organization', collection: @members, locals: { member_flag: true } %>

<% if local_assigns[:member_flag] && member_flag %>
  <td><%= organization.fish %></td>
<% end %>