2010-07-20 14 views
9

Estoy escribiendo un componente de middleware de rack para una aplicación de rieles que necesitará configurar cookies de forma condicional. Actualmente estoy tratando de averiguar para configurar las cookies. De buscar en Google parece que esto debería funcionar:¿Cómo configuro una cookie con un componente de middleware de rack (ruby)?

class RackApp 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    @status, @headers, @response = @app.call(env) 
    @response.set_cookie("foo", {:value => "bar", :path => "/", :expires => Time.now+24*60*60}) 
    [@status, @headers, @response] 
    end 
end 

que no da errores, pero tampoco configura una cookie. ¿Qué estoy haciendo mal?

Respuesta

23

Si desea utilizar la clase de respuesta, necesita crear una instancia de los resultados de llamar a la capa de middleware más abajo en la pila. Además, no es necesario variables de instancia de un middleware como esto y probablemente no quieren que se les utilice de esa manera (@ estatus, etc se quedaría en torno a la instancia de middleware después de la solicitud se sirve)

class RackApp 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    status, headers, body = @app.call(env) 
    # confusingly, response takes its args in a different order 
    # than rack requires them to be passed on 
    # I know it's because most likely you'll modify the body, 
    # and the defaults are fine for the others. But, it still bothers me. 

    response = Rack::Response.new body, status, headers 

    response.set_cookie("foo", {:value => "bar", :path => "/", :expires => Time.now+24*60*60}) 
    response.finish # finish writes out the response in the expected format. 
    end 
end 

Si sabe lo que está haciendo, puede modificar directamente el encabezado de la cookie, si no desea crear una instancia de un nuevo objeto.

+0

Impresionante. Esto está funcionando perfectamente para mí. El ejemplo más claro que he visto hasta ahora. – phaedryx

+0

Gracias! Cinco años después, este fragmento era exactamente lo que estaba buscando. – Anurag

+0

@BaroqueBobcat Sería muy útil si incluyera cómo podría modificar directamente la cookie. ¡Gracias por la gran respuesta! – thesecretmaster

13

También puede usar la biblioteca Rack::Utils para establecer y eliminar encabezados sin crear un objeto Rack :: Response.

class RackApp 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    status, headers, body = @app.call(env) 

    Rack::Utils.set_cookie_header!(headers, "foo", {:value => "bar", :path => "/"}) 

    [status, headers, body] 
    end 
end 
Cuestiones relacionadas