AJAX提交POST请求后,Rails的request_parameters为何返回重复嵌套参数?
问题:Rails AJAX提交后request_parameters出现嵌套重复参数
尝试从Rails的AJAX表单提交中解析POST参数,但总是包含一套嵌套的重复参数。
AJAX代码:
$.ajax({ type: 'POST', url: url, data: JSON.stringify({foo:'bar',timestamp:Date.now()}), dataType: 'json', contentType: 'application/json; charset=utf-8' });
Rails控制器代码:
class TestController < ApplicationController def post_test puts "RAW POST: #{request.raw_post}" puts "POST PARAMS: #{request.request_parameters().to_json}" end end
运行结果:
RAW POST: {"foo":"bar","timestamp":1690813226909}
POST PARAMS: {"foo":"bar","timestamp":1690813226909,"test":{"foo":"bar","timestamp":1690813226909}}
原因与解决方法
这是Rails内置的wrap_parameters特性导致的。默认配置下,Rails会自动将JSON格式的请求参数,额外包裹到以当前控制器名称(小写)命名的键下——这里控制器是TestController,所以生成了test键,同时又保留了顶层的原始参数,最终出现重复嵌套。
解决方式:
- 控制器级别关闭:在
TestController中添加一行配置,直接禁用该控制器的参数包裹:class TestController < ApplicationController wrap_parameters false def post_test # ... 原有代码 end end - 全局配置调整:如果不需要全局开启该特性,可以修改
config/initializers/wrap_parameters.rb文件,注释掉默认的包裹规则,或者调整仅针对特定控制器生效。 - 指定包裹字段:如果只需要包裹部分参数,而非全部,可以明确指定字段,比如
wrap_parameters :foo,这样只会把foo字段包裹到test键下,避免全量重复。
内容的提问来源于stack exchange,提问作者Yarin
相关产品推荐
相关产品推荐

