1

Xと呼ばれるレールアプリとYと呼ばれるレールマウント可能なエンジンがあります。アプリXにはDeviseがあり、エンジンYにはホストアプリのデバイスインストールで動作するCanCanがあります。ホスト アプリとマウント可能なエンジンの懸念を分離するために、エンジンにはホスト アプリと同様に CanCan 機能モデルがあります。私の問題は次のとおりです。CanCanのドキュメントに従って、 https://github.com/ryanb/cancan/wiki/Changing-Defaultsのようにデフォルトの機能モデルを変更できます。私の問題は、マウント可能なエンジンのアプリケーションコントローラーでデフォルトの能力クラスを次のようにセットアップすると、次のようになることです。

module Y
  class ApplicationController < ActionController::Base
    def current_ability 
      @current_ability = Ability.new(current_user)
    end
  end
end

次のエラーが表示されます。

uninitialized constant Ability

(ちなみに、ファイルを編集してサーバーを再起動せずにページをリロードすると、正常に動作します)

ただし、同じメソッドをホスト アプリのアプリケーション コントローラーに入れると、次のようになります。

class ApplicationController < ActionController::Base
  def current_ability 
    @current_ability = Y::Ability.new(current_user)
  end
end

すべてが期待どおりに機能します (これは、Devise と CanCan が正しくセットアップされていることも意味します)。

なぜこれが起こっているのか誰にも分かりますか?私はマウント可能なエンジンを正しく理解していないかもしれませんが、それらはホスト アプリから分離されているといつも思っていました。したがって、マウント可能なエンジンによって定義されたページにアクセスするとき、ホスト アプリのアプリケーション コントローラーは実行されるべきではありません。

4

1 に答える 1

0

エンジン アプリケーション コントローラがまったくロードされていない可能性が最も高いです。メイン アプリで同じクラス名を使用すると、Rails エンジンの動作が悪くなります。あなたが見たい場合は、ここに問題があります。エンジンで明示的な宣言を使用することをお勧めします。Ability の代わりに Y::Ability を使用します。

于 2012-05-22T20:54:44.583 に答える