【问题标题】:Rails 3.2 Engine weirdness with before_filterRails 3.2 引擎怪异与 before_filter
【发布时间】:2012-07-12 10:02:24
【问题描述】:

我有一个 Rails 3.2.6 应用程序,需要您登录才能使用它。它还有一个安装到/api 的 Rails 引擎,它为某些部分提供 JSON API,无需身份验证。

当我启动 Rails 服务器并发出以下请求时:

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

一切都按预期工作,API 请求按应有的方式返回 JSON,主页呈现 html 页面。

这是奇怪的部分。如果我在启动 Rails 服务器后立即按此顺序发出请求:

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

然后 API 请求失败。来自根 Rails 应用程序的 before 过滤器触发 API 引擎,导致重定向到 API 引擎中不存在的 UserSessionsController#new,并且失败。如果先向 API 引擎而不是根 Rails 应用程序发出请求,则 API 引擎不会在过滤器之前继承。任何关于这种怪异的线索都会很棒:)

虽然我目前的计划是将 API 引擎变成一个适当的独立 Rack 应用程序。在这一点上,它是引擎的唯一原因似乎是因为在我之前有人真的很喜欢引擎。

【问题讨论】:

  • 我的理解正确:你的 Root 应用中似乎有一些 before_filter :authenticate_user,对吗?

标签: ruby-on-rails ruby rails-engines before-filter


【解决方案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 文件,该文件在ApiEngine 模块中遇到ApplicationController 常量。但是::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

追踪起来有点棘手,特别是处理别人的代码,你倾向于假设某些“基本”的东西正在按它们应该的方式工作。如果其他人发现自己处于类似奇怪的情况,希望这个答案可能有用:)

【讨论】:

    猜你喜欢
    • 2012-04-20
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 2013-06-26
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多