6

いくつかの一般的なフォーム機能のために独自のエンジンを構築している私のRailsアプリケーションでは、CanCanを使用して権限を与えています。ユーザーのエンジンコントローラの操作に自由にアクセスできないように、私のシステムでパーミッションをロックしたいと思います。これらのコントローラーは、ほとんどの場合、7つのRESTアクションを使用するだけなので、各コントローラーの上部にCanCanのload_and_authorize_resourceを使用したいと思います。しかしCanCan:MainApp以外の名前空間でのload_and_authorize_resource

、私はこのような私のコード書くとき:

module MyEngine 
     class FormController < ApplicationController 
     load_and_authorize_resource 
     ... 
     end 
    end 

を、私はこのエラーを取得する:

uninitialized constant Form 

私の推測では、load_and_authorize_resource自動ローダは私のMainAppに名前空間に結び付けられているということで、別の名前空間で呼び出すことを認識していないため、MyEngine::Form.find(params[:id])ではなくForm.find(params[:id])のような呼び出しもあります。

この場合、どうすれば修正できますか? authorize!はまだ正常に動作しているので大したことではないので、それぞれのアクションで個別に認可を定義することができますが、load_and_authorize_resourceメソッドを使用することができれば、よりきれいに感じられます。

+0

[CanCanを使用して名前空間とネストされたコントローラを認証する](http://stackoverflow.com/questions/12334367/authorizing-namespaced-and-nested-controllers-using-cancan) –

答えて

6

CanCan::ControllerResource#namespaceのバグのようです:

def namespace 
    @params[:controller].split("::")[0..-2] 
end 

ご覧のとおり、それは::により、コントローラパスを分割しようとしますが、それはmy_engine/my_controllerの形式で提供されます。

ので修正はダム単純です:

def namespace 
    @params[:controller].split("/")[0..-2] 
end 

は、彼らはあまりにも長い間、このような愚かなバグを欠場する可能性がどのようワンダー。それらにプルリクエストを送信する必要があります。

P.S.ちょうど答えにサインアップしました8)

+1

ああ!もっと面白いです:彼らは 'master 'ブランチへの修正をマージすることを忘れているようです。 https://github.com/ryanb/cancan/issues/663 –

+0

いいです、これは私が必要だったものでした! –

+1

このためのパッチは[1.6.10](https://github.com/ryanb/cancan/pull/675) –

8

CanCanは名前空間モデルを見つけることができません。クラスを指定するようにしてください:

load_and_authorize_resource class: MyEngine::Form 
3

モデルクラスが異なっコントローラよりも名前空間されている場合は、あなたが:classオプションを指定する必要があります。

module MyEngine 
    class FormController < ApplicationController 
    load_and_authorize_resource :class => MyEngine::Form 
    ... 
    end 
end 
+0

私はこのために '初期化されていない定数MyEngine :: Form'を取得しています。 – hlcs