【问题标题】:Rack and rack.request.form_vars / rack.request.form_hash机架和机架.request.form_vars / rack.request.form_hash
【发布时间】:2011-02-17 12:33:11
【问题描述】:

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

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

【问题讨论】:

  • 我也想知道这个。如果你发现了什么,请告诉我。
  • 在 Rails 源代码树中搜索 form_varsform_hash 没有结果,这表明 Rails 不使用其中任何一个?我和你一样困惑。

标签: ruby-on-rails ruby rack


【解决方案1】:

让我们看看源代码!这两个变量都来自使用 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

【讨论】:

  • 查看源代码和理解源代码是两件不同的事情 :) 所以感谢您的解释。
【解决方案2】:

如果您有包含this pull request 的最新机架副本,您可以使用Rack::Request#update_param

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

就像上面的 req.POST 解决方案一样,这将在中间件之间传递的 env 中持续存在 - 但它是一个更高级别的调用,旨在处理像您这样的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    相关资源
    最近更新 更多