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