Rack和rack.request.form_vars/rack.request.form_hash

jri*_*iff 4 ruby rack ruby-on-rails

我正在做一些中间件,它会在它到达Rails之前更改authenticity_token参数.

我可以看到env.inspect同时提供了rack.request.form_vars和rack.request.form_hash.两者都包含真实性令牌.Rails使用哪一个,为什么Rack同时提供?

Mii*_*kka 7

让我们来看看源头!这两个变量来自使用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
Run Code Online (Sandbox Code Playgroud)