4

我的 API 正在处理来自外部源的回调,该回调发送包含action参数的 POST。该参数与 rails 动作无关,只是名称相同:

param1=value1&action=example&param2=value2

当这命中rails时,rails将参数覆盖为动作的名称(在这种情况下create)......所以我得到:

{ action: 'create', param1: 'value1', params2: 'value2' }

如何action以干净的方式访问原始参数?目前我必须解析raw_post

Rack::Utils.parse_query(request.raw_post)["action"]

哪个丑……有什么更好的吗?

4

1 回答 1

0

您可以创建一个 Rack 中间件来拦截在参数中有操作的请求,并在转发之前重命名它们。

我相信它看起来像:

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

  def call(env)
    # you might want to only do this for certain paths
    if env["rack.request.form_hash"] && env["rack.request.form_hash"]["action"]
      env["rack.request.form_hash"]["action_param"] = env["rack.request.form_hash"].delete("action")
    end
    if env["rack.request.form_vars"] && env["rack.request.form_vars"].match(/[\?&]action\=/)
      env["rack.request.form_vars"].gsub!(/([\?&])action\=/, /\1action_param=/)
    end
    @app.call(env)
  end
end

我猜你会把它添加到你的 config/initializers/action_renamer.rb 或者现在在 Rails 中有效:

Rails::Initializer.run do |config|
  config.middleware.use "ActionParamRenamer"
end
于 2014-05-21T18:24:48.963 回答