2012-08-22 46 views
0

我有應用程序和引擎(gems,Rails :: Engine)。 CanCan用於授權,我想在引擎中使用它。 發動機分離的命名空間,但是,例如:CanCan的能力和附加規則引擎

module MyEngine 
    class ApplicationController < ::ApplicationController 
    end 
end 

所以,我可以用在控制器load_and_authorize_resource(必須指定模型類名)和「可以」幫手也。我必須在主應用程序中寫入能力的所有能力(來自引擎的模型必須是命名空間)。這不是很好的方式。我想在這個引擎中指定引擎的能力,但不需要創建新的能力對象。 我該怎麼做?任何想法?

+0

其中一個解決方案:在引擎中將'MyEngine :: Ability'類作爲模型('include :: CanCan :: Ability'),並在這裏編寫引擎的功能。將'before_filter'添加到'ApplicationController'中,它會生成'current_ability.merge(MyEngine :: Ability.new(current_user))'。也許這是我想要的... –

回答

2

這不是非常漂亮,但我做了一些類似於我正在寫的Rails應用程序。我在這個名爲FormX的應用程序中寫了自己的引擎,這是一種形式的CMS引擎。我希望用戶能夠僅編輯某些表單響應,並且只有一些用戶纔有能力創建表單。

鑑於我曾在Formx命名空間Form模型,我能夠在我的MainApp ability.rb文件使用Formx::Form語法做定義的能力。

Ex。

can :manage, Formx::Form 

然後在我的控制,我不得不手動將authorize!通話中的每個動作,因爲我不能讓load_and_authorize_resource到發動機的命名空間內工作。

+2

嘗試使用'load_and_authorize_resource class:Form',它與引擎命名空間一起工作。 –