ruby-on-rails - 在 Rails 中处理带有 "action"参数的 POST

标签 ruby-on-rails ruby post rails-api

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

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"]

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

最佳答案

您可以创建一个 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

关于ruby-on-rails - 在 Rails 中处理带有 "action"参数的 POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23789966/

相关文章:

Ruby 捕获所有异常类

ruby-on-rails - Rails,生产环境, "Object is not missing constant"

ruby-on-rails - 如何使用 Devise/CanCan 保护已安装的 Engine 资源?

ruby-on-rails - 运行 rspec 时关于 'circular require' 的警告太多

ruby-on-rails - Ruby on Rails 是否处理并发请求?

ruby-on-rails - 如何通过 devise_invitable 邀请现有用户

ruby - 如何从 Ruby 中的字符串中去除制表符?

javascript - 使用 jQuery 和 POST 形成值 - 单个复选框

javascript - GET/POST node.js(跨域)

R -curl(不是 httr)带 JSON 正文的 POST 请求