【问题标题】:Breaking changes in Rails 4 JSON rendering?Rails 4 JSON 渲染的重大变化?
【发布时间】:2013-05-18 18:31:20
【问题描述】:

我在 Rails 4 上启动了一个新应用程序,我注意到默认情况下 JSON 渲染的实现方式似乎发生了重大变化,但我在任何地方都找不到它,所以我想知道是否有人可以提供我对 (1) API 是否确实发生了变化以及 (2) 我如何获得我需要的行为(即旧行为)有所了解。

特别是,我看到的是,在 Rails 3 中的位置

@answer.as_json

...会返回...

{
  id: 1,
  body: "lorem ipsum..."
  ....
}

在 Rails 4 中,似乎返回的是相同的方法:

{
  'answer':
    {
      id: 1,
      body: "lorem ipsum..."
      ...
    }
}

其他人可以确认这种行为已经改变吗?除了为每个模型覆盖 as_json 之外,有什么方法可以让旧行为恢复原状?

这个新实现使得返回包含多个模型的 JSON 响应变得更加麻烦(现在要么必须通过控制器操作中的“render :json ...”调用中的哈希合并来完成,要么通过覆盖 as_json )。

【问题讨论】:

  • 你看过config/initializers/wrap_parameters.rb吗?

标签: ruby-on-rails ruby activerecord ruby-on-rails-4


【解决方案1】:

有一个选项ActiveRecord::Base.include_root_in_json 控制as_json 方法的顶级行为。我猜这个名字是不言自明的。

关于一个重大的 API 更改:如果您深入了解源代码,您可以看到该选项的默认值在 Rails 4.0.0.beta1 中更改为 true,但后来在 Rails @ 中恢复为 false 987654322@.

如果您想确保 JSON 不会包含根节点,请在 config/initializers/wrap_parameters.rb 中指定 include_root_in_json 选项:

ActiveSupport.on_load(:active_record) do
  self.include_root_in_json = false
end

【讨论】:

  • 谢谢!希望这一点得到更好的宣传。至少,当 beta1(或任何更改默认设置的未来版本)上的人们注意到这一点时,希望他们会登陆此页面。
  • @NickZ 你知道你可以将有用的答案标记为accepted吗? ;)
猜你喜欢
  • 2013-07-24
  • 1970-01-01
  • 2013-09-08
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
相关资源
最近更新 更多