Крюк для драгоценных камней для добавления промежуточного ПО в стек Rack с Rails 3 - PullRequest
3 голосов
/ 26 июля 2010

Я пытаюсь выяснить, как гем в Rails 3 gemfile может автоматически добавить промежуточное ПО в стек Rack.Я ищу крюк в этом драгоценном камне.Например ... когда я добавляю гем devise в свой гемфайл Rails 3, тогда devise каким-то образом добавляет warden в качестве промежуточного ПО в стек Rack.Кажется, это работает автоматически.В приложении Rails 3 дальнейшая настройка не требуется.Я думаю, там автоматически вызывается специальный класс / метод из boot.rb.Любые намеки, как этот процесс действительно работает?

Ответы [ 3 ]

9 голосов
/ 13 апреля 2012

Вы должны использовать Railtie.Фактически, это тот самый пример, приведенный в документации Rails :: Railtie .

class MyRailtie < Rails::Railtie
  initializer "my_railtie.configure_rails_initialization" do |app|
    app.middleware.use MyRailtie::Middleware
  end
end
8 голосов
/ 01 августа 2011

Чтобы вставить промежуточное программное обеспечение в драгоценный камень, вы должны добавить его в движок драгоценного камня.

в lib/gem_name/engine.rb

require 'rails'

module GemName
  class Engine < Rails::Engine

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

  end
end
3 голосов
/ 26 июля 2010

Это точно не покажет, как гем / плагин подключается к промежуточному программному обеспечению, но это то, как вы можете это сделать.Исходя из этого, гем / плагин может делать то же самое:

Чтобы вставить промежуточное ПО, вы можете запустить его в файле инициализации.

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

Выше будет вставлено промежуточное ПО Flash Cookie(пользовательский код) до загрузки стойки session_store.

Чтобы увидеть свое собственное промежуточное ПО, запустите rake middleware

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
...