Ruby on rails gems的钩子将中间件添加到带有Rails 3的机架堆栈上

Ruby on rails gems的钩子将中间件添加到带有Rails 3的机架堆栈上,ruby-on-rails,rack,Ruby On Rails,Rack,我试图找出Rails 3 gem文件中的gem如何自动将中间件添加到机架堆栈中。我在找那颗宝石上的钩子。 例如当我将designe gem添加到rails3gem文件中时,designe以某种方式将warden添加为机架堆栈上的中间件。这似乎是自动工作的。Rails 3应用程序中不需要进一步的配置。我猜boot.rb中会自动调用一个特殊的类/方法。有什么提示说明这个过程是如何工作的吗?这不会确切地说明gem/插件是如何连接到中间件的,但这是您可以做到的。基于此,gem/插件可以做同样的事情: 要

我试图找出Rails 3 gem文件中的gem如何自动将中间件添加到机架堆栈中。我在找那颗宝石上的钩子。
例如当我将designe gem添加到rails3gem文件中时,designe以某种方式将warden添加为机架堆栈上的中间件。这似乎是自动工作的。Rails 3应用程序中不需要进一步的配置。我猜boot.rb中会自动调用一个特殊的类/方法。有什么提示说明这个过程是如何工作的吗?

这不会确切地说明gem/插件是如何连接到中间件的,但这是您可以做到的。基于此,gem/插件可以做同样的事情:

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

ActionController::Dispatcher.middleware.insert_before(ActionController::Base.session_store, FlashSessionCookieMiddleware, ActionController::Base.session_options[:key])
在加载会话存储架之前,上面将插入一个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
使用机架::锁
使用ActionController::Failsafe
使用FlashSessionCookie中间件,“\uxxxxxx\u会话”
使用ActionController::Session::CookieStore#
使用ActionController::ParamSpaser
使用Rack::MethodOverride
使用Rack::Head
使用ActionController::StringImpression
使用ActiveRecord::ConnectionAdapters::ConnectionManagement
使用ActiveRecord::QueryCache
运行ActionController::Dispatcher.new

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

lib/gem\u name/engine.rb中

require 'rails'

module GemName
  class Engine < Rails::Engine

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

  end
end
require'rails'
模块名称
类引擎
您应该使用铁轨。事实上,这正是本文给出的例子

class MyRailtie
这解释了如何将中间件添加到机架堆栈的部分,谢谢。但是我仍然想知道当gem就在gem文件中时,rails3调用gem的什么方法/钩子?好的,我想我解决了它。问题是我在gem中找不到您提到的初始化文件。在Rails2.x中是Rails/init.rb。但这在Rails 3中不再被调用。方法是创建lib/gem_name.rb(其中gem_name是该gem的名称)。当gem文件中指定gem时,Rails 3将自动调用它。在那里,您可以添加中间件。(见)关于宝石很酷!对于Rails 2.3和更高版本(在它们移动到rack之后)——您在config/initializers目录中创建一个名为whater.rb的文件这是最干净的答案,我要补充的是,引擎是一个Railtie,因此您可以在引擎中使用该初始值设定方法,而不必创建单独的Railtie
config.app\u中间件
而不是
config.middleware
很重要。在这方面+1000%。在
Railtie
中,使用
app.config.app\u中间件。在
之前插入\u,以便在默认设置后配置中间件。
class MyRailtie < Rails::Railtie
  initializer "my_railtie.configure_rails_initialization" do |app|
    app.middleware.use MyRailtie::Middleware
  end
end