6

いくつかの汎用フォーム機能用に独自のエンジンを構築したRailsアプリケーションのアクセス許可にCanCanを使用しています。ユーザーがエンジンコントローラーのアクションに自由にアクセスできないように、システムのアクセス許可をロックダウンしたいと思います。load_and_authorize_resourceこれらのコントローラーは、ほとんどの場合、7つのRESTアクションを使用するだけなので、各コントローラーの上部にあるCanCanを使用したいと思います。

ただし、次のようにコードを書くと、次のようになります。

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

このエラーが発生します:

    uninitialized constant Form

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

この場合、どうすればこれを修正できますか?それでも適切に機能するため、大したことではないので、各アクションで承認を個別に定義できますが、このメソッドauthorize!を使用できれば、はるかにクリーンに感じるでしょう。load_and_authorize_resource

4

3 に答える 3

9

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

load_and_authorize_resource class: MyEngine::Form
于 2012-08-21T17:14:53.357 に答える
6

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

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

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

したがって、修正は非常に簡単です。

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

どうしてそんなばかげたバグをこんなに長い間見逃すことができるのだろうか。それらにプルリクエストを送信します。

PSは答えにサインアップしたばかりです8)

于 2013-03-01T20:25:51.463 に答える
3

モデルクラスの名前空間がコントローラーとは異なる場合は、:classオプションを指定する必要があります。

module MyEngine
  class FormController < ApplicationController
    load_and_authorize_resource :class => MyEngine::Form
    ...
  end
end
于 2012-08-22T08:32:22.607 に答える