2013-02-23 124 views
0

我正在嘗試使用CanCan來定義塊中的能力。在ability.rb我有權限定義爲:爲什麼塊中定義的CanCan總是返回true?

can [:create, :show], Comment do |comment| 
    if !group.nil? 
     is_a_group_member(current_user_group_member) == true 
    elsif user.admin? 
    is_a_user_admin(current_user) 
    end 
end 

不管這些總是返回true。但是,如果我將該功能寫入一行:

can [:create, :show], Comment if (!group.nil? && is_a_group_member(current_user_group_member) == true) || (user.admin? && is_a_user_admin(current_user)) 

當ability.rb權限使用一行時,它按預期工作。當我使用塊時,它總是返回true。任何想法或想法爲什麼這是打破?由於

+1

在寶石的文檔中明確說明,您應該只對資源本身的條件使用塊 – apneadiving 2013-02-23 23:52:40

+0

這是什麼意思? – AnApprentice 2013-02-24 00:26:28

+2

'塊僅在實際實例對象存在時才被評估。在檢查類的權限時(例如在索引操作中),不會評估它。這意味着任何不依賴於對象屬性的條件都應該移動到塊之外。 ' – apneadiving 2013-02-24 08:44:39

回答

0

if ... else部分是一個表達式,計算結果爲nil,如果條件是假的,或者,如果條件爲真,對什麼條件代碼評估爲。

對於您的情況,在多行if中,如果!group.nil?爲true,則返回is_a_group_member(current_user_group_member) == true。如果user.admin?爲真,則返回is_a_user_admin(current_user)。所以如果其中任何一個是真的,true將被退回。

相關問題