經過一堆挖掘我發現了這個問題。它與發動機本身。我應該指出,我不負責項目的創建,只是現在負責與它合作。
比方說,我們的主機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