我的API正在处理来自外部源的回调,该外部源发送包含action
参数的POST。这个参数与rails动作无关,它碰巧被命名为相同:
param1=value1&action=example¶m2=value2
当它击中rails时,rails会覆盖参数作为动作的名称(在本例中为create
)...所以我得到:
{ action: 'create', param1: 'value1', params2: 'value2' }
如何以干净的方式访问原始action
参数?目前我必须解析raw_post
:
Rack::Utils.parse_query(request.raw_post)["action"]
哪个丑陋......还有什么更好的?
答案 0 :(得分:0)
您可以创建一个Rack中间件来拦截在params中有操作的请求,并在向前传递之前重命名它们。
我相信它看起来像:
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