0

Railsアプリにマウント可能なエンジンを追加しています。これは、フォーラムのような機能を提供します(つまり、質問、回答、コメントなどを追加します)。開発ではすべてが正常に機能します。ただし、ステージング/本番環境では、回答を作成しようとするとエラーが発生します。具体的には、CanCanパーミッションエラーです(これは赤いニシンかもしれませんが)。しかし、tiは名前空間または名前の衝突に関連しているように感じますか?

とにかくconfig.cache_classes = false、環境設定ファイルに設定すると、問題は解決します。しかし、それは本当に物事を遅くするので、それは受け入れられる解決策ではありません。

ここからどこへ行くの?どのクラスをリロードする必要があるかをどのように判断できますか?この問題に対処するための従来の方法は何ですか?

Rails3.1を使用しています。

4

1 に答える 1

3

私は問題を理解しました。起動順序の問題でした。私Engine::AnswersControllerは私の前にロードされていEngine::ApplicationControllerました。私のコードでは、 から継承していましたApplicationController。つまり、Engine::AnswerControllerエンジンの.Engine::ApplicationControllerApplicationControllerApplicationController

修正は、エンジンの名前空間を明示的にすることで、アンサー コントローラーがメイン アプリではなくエンジンから強制的に継承されるようにすることでした。

Engine::AnswersController < Engine::ApplicationController

この問題が私のアプリケーションにとってかなり特異であることは理解していますが、解決策にたどり着いた方法は他の人にとって役立つかもしれません。この種の問題に直面した場合は、ある種のデバッガー (私はPryを使用しました) にドロップダウンして、物事の調査を開始してください。具体的には、ロードされているクラスを確認し、継承チェーン (つまりEngine::ApplicationController.ancestors) を詳しく調べます。奇妙に思えるものを探します。

また、問題がエンジンに関連している場合は、エンジンとメイン アプリの両方にデバッガーを配置する必要がある場合があります。エンジンで発生したエラーが必ずしもメイン アプリに反映されるとは限らないため、エンジンのデバッグは困難な場合があります。

これを理解するのを手伝ってくれたtjbladezに感謝します。

于 2011-10-26T18:38:10.063 に答える