如何仅为特定集合

时间:2015-08-11 11:57:41

标签: ruby-on-rails ruby ruby-on-rails-4 partial-views

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

<%= 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可能部分重叠,所以在部分我不认为可以根据{背后的内容来区分{1}};相反,如果可能,有必要在部分基础上区分哪个集合(在=传递给部分之前):

=

或者我可以在渲染一个键的部分传递时,然后在部分传递,如果该键是def show @user = User.friendly.find(params[:id]) @members = @user.organizations.where('member = ?', true) @organizations = @user.organizations.where('moderator = ?', true) ... end 它只显示一段代码?

2 个答案:

答案 0 :(得分:2)

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

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

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 %>

只是粗略地了解它是如何完成的。在这种情况下,您甚至可以将混合的对象集合传递给partial,如果每个模型都定义了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 %>

答案 1 :(得分:1)

假设@members是Member的集合。你可以像

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