2012-07-12 85 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