2010-07-20 3 views
9

Я пишу компонент промежуточного программного обеспечения стойки для приложения rails, которому необходимо условно установить файлы cookie. В настоящее время я пытаюсь настроить файлы cookie. От всего прибегая к помощи, кажется, что это должно работать:Как установить cookie с компонентом промежуточного программного обеспечения стойки (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 

, который не дает ошибки, но не устанавливает куки либо. Что я делаю не так?

ответ

23

Если вы хотите использовать класс Response, вам необходимо создать его из результатов вызова слоя промежуточного программного обеспечения дальше по стеку. Кроме того, вам не нужен переменный экземпляр для промежуточного слоя, как это и, вероятно, не хотят, чтобы использовать их таким образом (@ статус и т.д. будут оставаться примерно в межплатформенной инстанции после того, как запрос подается)

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 

Если вы знаете, что делаете, вы можете напрямую изменить заголовок файла cookie, если вы не хотите создавать экземпляр нового объекта.

+0

Awesome. Это отлично работает для меня. Самый яркий пример, который я видел до сих пор. – phaedryx

+0

Спасибо! Пять лет спустя этот фрагмент был именно тем, что я искал. – Anurag

+0

@BaroqueBobcat Было бы очень полезно, если бы вы включили, как вы могли напрямую изменять cookie. Спасибо за отличный ответ! – thesecretmaster

13

Вы также можете использовать библиотеку Rack::Utils для установки и удаления заголовков без создания объекта 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