2012-11-06 45 views
0

用戶屬於一個組織。用戶可以查看所有組織,但只能查看其組織內的用戶。當用戶查看組織時,我必須添加過濾邏輯到視圖,因此@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片段。

回答

0

慘慘已經內置支持此與accessible_by方法是適用於您的活動記錄模式。

有關更多信息,請參閱https://github.com/ryanb/cancan/wiki/Fetching-Records

+0

這是一個很好的建議,但我回避'accessible_by',因爲我有一個使用塊的能力定義。我更新,以澄清問題,但會接受你的答案,或者至少投上一票,如果沒有我的情況下更好的辦法。 – Anson