4

我试图找出 Rails 3 gemfile 中的 gem 如何自动将中间件添加到 Rack 堆栈。我正在寻找那颗宝石中的钩子。例如......当我将设计 gem 添加到我的 Rails 3 gemfile 时,然后设计以某种方式将warden 作为中间件添加到 Rack 堆栈上。这似乎是自动工作的。Rails 3 应用程序无需进一步配置。我想boot.rb会自动调用一个特殊的类/方法。任何提示这个过程如何真正起作用?

4

3 回答 3

9

你应该使用 Railtie。事实上,这正是Rails::Railtie 文档中给出的示例。

class MyRailtie < Rails::Railtie
  initializer "my_railtie.configure_rails_initialization" do |app|
    app.middleware.use MyRailtie::Middleware
  end
end
于 2012-04-13T15:36:08.203 回答
8

要在 gem 中插入中间件,您应该将其添加到 gem 的引擎中。

lib/gem_name/engine.rb

require 'rails'

module GemName
  class Engine < Rails::Engine

    config.app_middleware.insert_before(Warden::Manager, Rack::OpenID)

  end
end
于 2011-08-01T16:20:04.623 回答
3

这不会准确显示 gem/plugin 是如何连接到中间件的,但这就是你可以做到的。基于此,gem/plugin 可以做同样的事情:

要插入中间件,您可以在初始化文件中运行它。

ActionController::Dispatcher.middleware.insert_before(ActionController::Base.session_store, FlashSessionCookieMiddleware, ActionController::Base.session_options[:key])

上面会在 session_store rack 加载之前插入一个 Flash Cookie 中间件(自定义代码)。

要查看您自己的中间件,请运行rake 中间件

use Rack::Lock
use ActionController::Failsafe
use FlashSessionCookieMiddleware, "_xxxxxx_session"
use ActionController::Session::CookieStore, #<Proc:0x00000001037d4f20@(eval):8>
use ActionController::ParamsParser
use Rack::MethodOverride
use Rack::Head
use ActionController::StringCoercion
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
run ActionController::Dispatcher.new
于 2010-07-26T13:05:22.387 回答