经过一堆挖掘我发现了这个问题。它与发动机本身。我应该指出,我不负责项目的创建,只是现在负责与它合作。
比方说,我们的主机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
这是一个有点棘手的追查,专门对付别人的代码,你倾向于假定某些“基本”事物正在按照他们应该的方式工作。希望这个答案可能是有用的,如果任何人发现自己在类似的奇怪的情况:)
正如我的理解正确:你似乎有一些'before_filter:authenticate_user'在根应用程序,它是正确的? – bor1s 2012-07-12 14:10:52