2010-07-26 3 views
3

J'essaie de découvrir comment une gemme dans le gemfile Rails 3 peut automatiquement ajouter un middleware à la pile Rack. Je cherche le crochet dans cette gemme. Par exemple ... quand j'ajoute le gemme de legs à mon gemfile de Rails 3, alors le concept ajoute d'une manière ou d'une autre le directeur comme intergiciel sur la pile de support. Cela semble fonctionner automatiquement. Il n'y a aucune autre configuration nécessaire dans l'application Rails 3. Je suppose qu'il est automatiquement appelé une classe/méthode spéciale à partir de boot.rb. Des allusions comment ce processus fonctionne vraiment?Crochet de gemmes pour ajouter un middleware sur la pile Rack avec Rails 3

Répondre

3

Cela ne montrera pas exactement comment un gem/plugin se connecte au middleware, mais c'est comme cela que vous pouvez le faire. Sur la base de cela, un gem/plugin peut faire la même chose:

Pour insérer un middleware, vous pouvez l'exécuter dans un fichier d'initialisation. Ce qui précède va insérer un middleware Flash Cookie (code personnalisé) avant le chargement du rack session_store.

Pour voir votre propre middleware, exécutez middleware râteau

use Rack::Lock 
use ActionController::Failsafe 
use FlashSessionCookieMiddleware, "_xxxxxx_session" 
use ActionController::Session::CookieStore, #<Proc:[email protected](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 
+0

Cela explique la partie de l'ajout de middleware à la pile Rack, merci. Mais je me demande toujours quelle méthode/crochet de la gemme est appelée par Rails 3, quand la gemme est juste dans le Gemfile? – Zardoz

+1

Ok, je pense que je l'ai résolu. Le problème était que je ne pouvais pas trouver le fichier d'initialisation que vous avez mentionné dans une gemme. Dans Rails 2.x, c'était rails/init.rb. Mais cela n'est plus appelé dans Rails 3. Le chemin à parcourir est de créer une lib/gem_name.rb (où gem_name est le nom de cette gem). Cela sera appelé automatiquement par Rails 3 lorsque la gemme est spécifiée dans le Gemfile. Et là, vous pouvez ajouter le middleware. (Voir https://rails.lighthouseapp.com/projects/8994/tickets/3745-railsinitrb-is-not-being-called-anymore) – Zardoz

+0

Cool sur les gemmes! Pour les Rails 2.3 et supérieurs (après leur déplacement en rack) - vous créez un fichier nommé quel.rb dans le répertoire config/initialiseurs –

7

Pour insérer middleware dans un bijou, vous devez l'ajouter au moteur de la pierre précieuse.

dans lib/gem_name/engine.rb

require 'rails' 

module GemName 
    class Engine < Rails::Engine 

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

    end 
end 
+0

C'est tout. 'config.app_middleware' au lieu de' config.middleware' est important. –

9

Vous devez utiliser un Railtie. En fait, c'est l'exemple même donné dans le Rails::Railtie documentation.

class MyRailtie < Rails::Railtie 
    initializer "my_railtie.configure_rails_initialization" do |app| 
    app.middleware.use MyRailtie::Middleware 
    end 
end 
+0

Ceci est la réponse la plus propre, et je voudrais ajouter que le moteur est un Railtie donc vous pouvez utiliser cette méthode d'initialisation dans votre moteur, vous n'êtes pas obligé de faire un railtie séparé – systho

Questions connexes