我在视图中对不同的集合使用相同的部分两次。这有效:
<%= 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
我有(@members
和organizations
可能部分重叠,所以在部分我不认为可以根据{背后的内容来区分{1}};相反,如果可能,有必要在部分基础上区分哪个集合(在=
传递给部分之前):
=
或者我可以在渲染一个键的部分传递时,然后在部分传递,如果该键是def show
@user = User.friendly.find(params[:id])
@members = @user.organizations.where('member = ?', true)
@organizations = @user.organizations.where('moderator = ?', true)
...
end
它只显示一段代码?
答案 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%>