破坏Rails 4 JSON渲染的变化?

Nic*_*k Z 1 ruby activerecord ruby-on-rails ruby-on-rails-4

我在Rails 4上启动了一个新的应用程序,我注意到默认情况下JSON渲染的实现方式似乎是一个突破性的变化,但我无法在任何地方找到它,所以我想知道是否有人能给我一些见解关于(1)API是否实际发生了变化,以及(2)我如何获得我需要的行为(即旧行为).

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

@answer.as_json
Run Code Online (Sandbox Code Playgroud)

......会回来......

{
  id: 1,
  body: "lorem ipsum..."
  ....
}
Run Code Online (Sandbox Code Playgroud)

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

{
  'answer':
    {
      id: 1,
      body: "lorem ipsum..."
      ...
    }
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以确认此行为已更改?是否有任何方法可以使旧的行为无法覆盖每个模型的as_json?

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

Ily*_*kov 5

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

至于破API的变化:如果你深入到源代码,你可以看到,此选项的默认值改为true在Rails的4.0.0.beta1但后来它被还原到falseRails中4.0.0.rc1.

如果要确保JSON不包含根节点,请include_root_in_jsonconfig/initializers/wrap_parameters.rb以下位置指定选项:

ActiveSupport.on_load(:active_record) do
  self.include_root_in_json = false
end
Run Code Online (Sandbox Code Playgroud)