如何使部分代码仅针对特定集合显示
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
我有(@members
和organizations
可能部分重叠,所以在部分我不认为可以根据后面的内容来区分=
; 相反,如果可能的话,有必要根据哪个集合来区分部分(在 =
传递给部分之前):
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 %>
我在不同集合的视图中两次使用相同的部分。这有效:
<%= 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
可能部分重叠,所以在部分我不认为可以根据后面的内容来区分=
; 相反,如果可能的话,有必要根据哪个集合来区分部分(在 =
传递给部分之前):
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 %>