2011-01-27 12 views
5

quiero probar un middleware de rack simple "hello world", pero parece que me atasco. parece que el sytax principal que ha cambiado, ya que algunos ejemplos usan este código:Hello World rack middleware con rieles 3: cómo procesar el cuerpo de todas las solicitudes

require 'rack/utils' 

class FooBar 

    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    status, headers, body = @app.call(env) 
     body.body << "\nHi from #{self.class}" 
     [status, headers, body] 
    end 
end 

produce un error:

undefined method `<<' for #<ActionDispatch::Response:0x103f07c48> 

aun cuando miro a otros códigos por ahí, me parece que no puede conseguir corriendo con rieles 3.0.3.

aquí están mis preguntas concretas:

  • ¿Cómo puedo obtener un simple estante middleware para ejecutar y modificar el cuerpo de cualquier salida de una aplicación de rieles?
  • ¿dónde debería poner la declaración Rails.application.config.middleware.use? (Creé un inicializador propio en config/initializers para eso)

¡muchas gracias de antemano!

Respuesta

6

Esto debería hacer lo que quiere:

# in config/application.rb 
config.middleware.use 'FooBar' 

# in config/initializers/foo_bar.rb 
class FooBar 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    status, headers, response = @app.call(env) 
    [status, headers, response.body << "\nHi from #{self.class}"] 
    end 
end 

Tenga en cuenta, que en casi todos los demás solicitud (al menos en los carriles 3.0.3), esto va a fallar debido a otro middleware (Rack: : Head) porque envía una solicitud vacía cuando el contenido no se modifica. Estamos en este ejemplo dependiendo de poder llamar a response.body, pero de hecho, el último miembro de la matriz puede ser cualquier cosa que responda a .each.

Ryan Bates alto estante bastante bien aquí:

http://asciicasts.com/episodes/151-rack-middleware

http://railscasts.com/episodes/151-rack-middleware

y los carriles de guía oficial es bastante bueno también:

http://guides.rubyonrails.org/rails_on_rack.html

Y por supuesto la especificación oficial de Rack:

http://rack.rubyforge.org/doc/SPEC.html

6

rieles 3.2.12+:

previous respuesta no funciona para rieles 3.2.12+

Ésta hace:

# in config/application.rb 
config.middleware.use 'FooBar' 

# in config/initializers/foo_bar.rb 
class FooBar 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    status, headers, response = @app.call(env) 
    response.body += "\nHi from #{self.class}" 
    # response.body << "..." WILL NOT WORK 
    [status, headers, response] 
    end 
end