Rack и rack.request.form_vars / rack.request.form_hash - PullRequest
4 голосов
/ 17 февраля 2011

Я занимаюсь промежуточным программным обеспечением, которое изменяет параметр authenticity_token до того, как оно попадает в Rails.

Я вижу, что env.inspect выдает и rack.request.form_vars, и rack.request.form_hash. Оба содержат токен подлинности. Какой из них использует Rails и почему Rack предоставляет оба варианта?

Ответы [ 2 ]

7 голосов
/ 28 марта 2011

Давайте посмотрим на источник!Обе переменные происходят от использования вспомогательного класса Rack::Request.Это обеспечивает хороший интерфейс для параметров запроса.Приложениям Rack не обязательно его использовать, но Rails его использует.

Переменные предназначены для внутреннего использования Rack::Request.rack.request.form_vars содержит необработанное тело POST, а rack.request.form_hash содержит проанализированный хеш.ActionDispatch::Request наследуется от Rack::Request и получает параметры, используя Rack::Request#POST, который читает последнюю переменную.Вы можете использовать Rack::Request самостоятельно, чтобы изменить его.

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

  def call(env)
    req = Rack::Request.new(env)
    req.POST["authenticity_token"] = "foo"
  end
end
3 голосов
/ 05 мая 2012

Если у вас есть последняя копия стойки, которая включает этот запрос на извлечение , вы можете использовать Rack::Request#update_param:

request = Rack::Request.new(env)
request.update_param :auth_token, 'XXXXXXXXXXXXXXXX'

Так же, как и решение req.POST выше, это будетсохраняются в env, который передается между промежуточным программным обеспечением - но это вызов более высокого уровня, предназначенный для решения ситуаций, подобных вашей.

...