2012-07-12 37 views
0

我有一個Rails 3.2.6應用程序,它需要你登錄才能使用它。它還有一個安裝到/api的Rails引擎,它爲某些部分提供JSON API,而不需要驗證。Rails 3.2引擎怪異與before_filter

當我踢了Rails服務器並進行以下請求:

GET /api/something 
GET/
GET /api/something 

一切正常,該API的請求,因爲他們應該,主頁呈現HTML頁面返回JSON。

這是奇怪的部分。如果我做啓動Rails服務器之後順序的要求:

GET/
GET /api/something 
GET /api/something 

然後API請求失敗。來自根Rails應用的以前的過濾器針對API引擎觸發,導致重定向到UserSessionsController#new,這在API引擎中不存在,並且失敗。雖然如果首先向API引擎發出請求而不是根Rails應用程序,那麼API引擎不會在過濾器之前繼承。任何擺脫這種怪異的光線都會很棒:)

雖然我目前的計劃是將API引擎變成一個適當自包含的Rack應用程序。看起來這是一個引擎在這一點上的唯一原因是在我之前造成一個人真的很喜歡引擎。

+0

正如我的理解正確:你似乎有一些'before_filter:authenticate_user'在根應用程序,它是正確的? – bor1s 2012-07-12 14:10:52

回答

1

經過一堆挖掘我發現了這個問題。它與發動機本身。我應該指出,我不負責項目的創建,只是現在負責與它合作。

比方說,我們的主機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 

這是一個有點棘手的追查,專門對付別人的代碼,你傾向於假定某些「基本」事物正在按照他們應該的方式工作。希望這個答案可能是有用的,如果任何人發現自己在類似的奇怪的情況:)

+0

http://stackoverflow.com/questions/10042348/rails-3-2-engine-layouts – Chamnap 2013-09-06 16:05:26