2012-04-13 91 views
0

我試圖用慘慘滿足以下要求:如何根據關聯事實來限制CanCan中的記錄?

  1. 如果交易被分配到一對多的網絡,用戶可以閱讀協議,如果他/她是任何分配網絡中的一員。

  2. 如果交易未分配給任何網絡,則可以由任何註冊用戶查看,無論其網絡成員身份如何。

  3. 如果交易未分配給網絡,但交易標記爲member_only = true,則用戶可以閱讀交易,如果他/她是任何網絡的成員。

  4. 如果交易未分配給網絡並且標記爲member_only = false,則任何註冊用戶都可以閱讀交易。

  5. 客人(即非用戶)無法讀取任何交易

我覺得我有2-4覆蓋以下內容:

if current_user.persisted? 
    can :read, Deal, current_user.networks.empty? ? { member_only: false } : {} 
end 

但是,我不知道該如何進一步限制分配給網絡的交易。這可能與CanCan。如果是這樣,建議如何?謝謝。

回答

0

這是我想出來的。可能不是最好的解決方案,所以歡迎反饋。

if current_user.persisted? 
    can :read, Deal, { id: DealAccessPolicy.accessible_deal_ids_for(current_user) } 
end 

class DealAccessPolicy 
    def self.accessible_deal_ids_for(user) 
    Deal.pluck(:id) - (Network.all - user.networks).map{|r| r.deals.map(&:id)}.flatten.uniq 
    end 
end 
1

嘗試accessible_by。 這樣,如果用戶無法訪問數據,您只需顯示一個空列表。 換句話說,不是限制對頁面的訪問,而是使用cancan範圍限制對數據的訪問。

另請參閱:related answer

相關問題