たくさん掘り下げた後、私は問題を見つけました。それはエンジン自体にありました。私はプロジェクトの作成に責任を負っていないことを指摘しておく必要があります。
ホストのRailsアプリに...
app/controllers/application_controller.rb
:
class ApplicationController < ActionController::Base
before_filter :foo_bar
layout :application
end
そして、私たちのエンジンは api_engine と呼ばれ、ApiEngine
モジュールの下に分離され、...
app/controllers/api_engine/application_controller.rb
:
module ApiEngine
class ApplicationController < ActionController::Base
layout false
end
end
app/controllers/api_engine/post_controller.rb
:
module ApiEngine
class PostController < ApplicationController
# code goes here...
end
end
私がこれでどこに行くのか、もうわかりますか?問題は、Rails の動的ローディングと、愚かなエンジンの構造化の組み合わせです。
サーバーに対する最初の要求がエンジンの に対するものである場合、モジュール内の定数に遭遇PostController
するpost_controller.rb
ファイルが必要です。が定義されていないので、そうであるかどうかをチェックします。ApplicationController
ApiEngine
::ApiEngine::ApplicationController
::ApplicationController
application_controller.rb
ただし、最初のリクエストが を定義するホスト アプリに送信されたApplicationController
場合、エンジンがリクエストを受け取ると、単にApplicationController
ルート アプリから使用することになり、独自のバージョンのクラスを必要とすることはありません。
解決策はかなり単純で、エンジンのファイルで、ブロックlib/api_engine/engine.rb
内に正しいアプリケーション コントローラー ファイルが必要です。config.after_initialize
module ApiEngine
class Engine < Rails::Engine
isolate_namespace ApiEngine
config.after_initialize do
require "api_engine/application_controller"
end
end
end
特に他人のコードを扱う場合、特定の「基本的な」ことが正常に機能していると想定しがちです。他の誰かが同様の奇妙な状況に陥った場合、この回答が役立つことを願っています:)