用戶屬於一個組織。用戶可以查看所有組織,但只能查看其組織內的用戶。當用戶查看組織時,我必須添加過濾邏輯到視圖,因此@organizations.users
變爲@organizations.users.select{|u| can?(:read, u)}
。基於用戶的CanCan能力過濾模型的關聯集合
是否有更多的透明或典雅管理這個辦法?有沒有辦法擺脫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 %>
我想要的東西更接近這個觀點相反:
organization/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片段。
這是一個很好的建議,但我回避'accessible_by',因爲我有一個使用塊的能力定義。我更新,以澄清問題,但會接受你的答案,或者至少投上一票,如果沒有我的情況下更好的辦法。 – Anson