You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 10:43:22