经过一堆挖掘后,我发现了问题。它与引擎本身有关。我应该指出,我不负责项目的创建,只是现在负责使用它。
假设我们的主机 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
追踪起来有点棘手,特别是处理别人的代码,你倾向于假设某些“基本”的东西正在按他们应该的方式工作。如果其他人发现自己处于类似奇怪的情况,希望这个答案可能有用:)