用户属于一个组织。用户可以查看所有组织,但只能查看其组织内的用户。当用户查看组织时,我必须将过滤逻辑添加到视图中,因此@organizations.users
变为@organizations.users.select{|u| can?(:read, u)}
.
有没有办法更透明或更优雅地管理这个?有没有办法摆脱select{|u| can?(:read, u)}
或将其移至干燥的地方?
相关代码:
class Organization < ActiveRecord::Base
has_many :users
...
end
class Ability
...
can :read, User, :organization => @user.organization
end
组织/show.html.erb:(当前,糟糕的版本)
<% if @organization.users.select{|u| can?(:read, u)}.any? %>
<h4>Contacts</h4>
<ul class="unstyled">
<% for user in @organization.users.select{|u| can?(:read, u)} %>
<li>
<%= link_to user, user, class: "user" %>
</li>
<% end %>
</ul>
<% end %>
我想要更接近这个观点的东西:
组织/show.html.erb:
<% if @organization.users.any? %>
<h4>Contacts</h4>
<ul class="unstyled">
<% for user in @organization.users %>
<li>
<%= link_to user, user, class: "user" %>
</li>
<% end %>
</ul>
<% end %>
更新:
我正在避免accessible_by
,因为我有一个使用块的能力定义。
class Ability
...
can :read, User, :organization => @user.organization
can :read, User do |user|
user.is? :technical_contact
end
end
我知道这accessible_by
可以与块一起使用,但前提是提供了 SQL 片段。由于我的用户有很多角色并且存储为位掩码,因此我没有 SQL 片段。