ruby-on-rails - Rails 在请求的参数中将空数组转换为 nil

标签 ruby-on-rails json

我的应用中有一个 Backbone 模型,它不是典型的平面对象,它是一个大型嵌套对象,我们将嵌套部分存储在 MySQL 数据库的 TEXT 列中。

我想在 Rails API 中处理 JSON 编码/解码,以便从外部看起来您可以 POST/GET 这个大型嵌套 JSON 对象,即使它的一部分存储为字符串化 JSON 文本。

但是,我遇到了 Rails 神奇地将空数组转换为 nil 值的问题。例如,如果我发布这个:

{
  name: "foo",
  surname: "bar",
  nested_json: {
    complicated: []
  }
}

我的 Rails Controller 看到了这个:

{
  :name => "foo",
  :surname => "bar",
  :nested_json => {
    :complicated => nil
  }
}

所以我的 JSON 数据已被更改..

以前有人遇到过这个问题吗?为什么 Rails 会修改我的 POST 数据?

更新

这是他们做的地方:

https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/http/request.rb#L288

这就是~为什么他们这样做:

https://github.com/rails/rails/pull/8862

所以现在的问题是,在我的嵌套 JSON API 情况下如何最好地处理这个问题?

最佳答案

经过大量搜索,我发现您从 Rails 4.1 开始可以完全跳过 deep_munge “功能”

config.action_dispatch.perform_deep_munge = false

我找不到任何文档,但您可以在此处查看此选项的介绍: https://github.com/rails/rails/commit/e8572cf2f94872d81e7145da31d55c6e1b074247

这样做可能存在安全风险,此处记录:https://groups.google.com/forum/#!topic/rubyonrails-security/t1WFuuQyavI

关于ruby-on-rails - Rails 在请求的参数中将空数组转换为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14647731/

相关文章:

ruby-on-rails - ActiveRecord has_many 通过与 arg 的作用域关联

ruby-on-rails - 参数错误 : A copy of ApplicationController has been removed from the module tree but is still active

ruby-on-rails - Rails Devise gem 是否使用 cookie 进行身份验证?

C# linq to json 如何读取数组中的属性值

json - 需要一些帮助在 POST 请求后使用 JSON 数据填充 tableview

javascript - 页面根据 JSON 请求刷新

ruby-on-rails - 如何检查resque作业是否完成

ruby-on-rails - Rails Windows Vagrant 响应时间非常慢

java - 如何从 Java 中的 RESTFul 服务请求 GET 到 Ipstack API

javascript - 如果 JSON 和 Array 中存在相同的值,请执行某些操作