Как установить файл cookie с компонентом промежуточного программного обеспечения стойки (ruby)? - PullRequest
10 голосов
/ 21 июля 2010

Я пишу компонент промежуточного программного обеспечения стойки для приложения rails, для которого нужно будет условно установить куки. В настоящее время я пытаюсь выяснить, как установить куки. Похоже, что из-за прибегая к помощи, это должно сработать:

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. Что я делаю не так?

Ответы [ 2 ]

23 голосов
/ 21 июля 2010

Если вы хотите использовать класс 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, если не хотите создавать новый объект.

16 голосов
/ 10 ноября 2011

Вы также можете использовать библиотеку 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
...