2012-11-20 43 views
0

只是一個非常簡單的問題,我在rails中有一個lib文件夾內的模塊。在導軌模塊上使用cancan

在該模塊上,如果我們執行諸如Company.accessible_by(current_ability)之類的操作,則會出現名稱錯誤,其中current_ability未定義。

有人知道這個解決方案嗎?由於current_ability似乎只能在控制器中識別。

回答

0

您需要將current_ability傳遞到模塊中。 與會話和參數數據(以及current_user,如果您使用的是devise)一樣,您無法訪問您自己創建的這些內部模型或類。

這實際上是一件好事,因爲您不希望業務對象依賴於Web堆棧。 這些事情的一般方法(也適用於模型)要麼通過引用您傳入的current_ability來構造對象,要麼通過方法調用本身來構造對象。 下面是一些示例代碼:

class Foo 
    def initialize(ability) 
    @current_ability = ability 
    end 

    def list_companies 
    Company.accessible_by(@current_ability) 
    end 
end 

或者,如果你只需要一個電話:

class Foo 
    def list_companies(current_ability) 
    Company.accessible_by(current_ability) 
    end 
end 

這兩種情況是完全有效的,讓你輕鬆與模擬能力目標測試代碼。