Я пишу компонент промежуточного программного обеспечения стойки для приложения для направляющих, которое должно будет условно установить cookie. Я в настоящее время пытаюсь выяснить для установки cookie. От поиска с помощью Google вокруг этого кажется, что это должно работать:
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
который не дает ошибки, но не устанавливает cookie также. Что я делаю неправильно?
Если вы хотите использовать класс Response, вам нужно инстанцировать его из результатов вызова промежуточного уровня дальше по стеку. Кроме того, вам не нужны переменные экземпляра для такого промежуточного ПО и, вероятно, вы не захотите использовать их таким образом (@status и т.д. останутся в экземпляре промежуточного ПО после обработки запроса)
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, если не хотите создавать новый объект.