Ruby on Rails JSON序列化

tga*_*ard 3 ruby serialization json ruby-on-rails

我是Ruby on Rails的新手,所以如果这是一个明显的问题,请原谅我.

我从控制器方法返回一个JSON对象(假设类名是"foo",它有一个属性"bar").

我希望这可以序列化为:

{"bar" : "barValue" }
Run Code Online (Sandbox Code Playgroud)

但是,它似乎序列化为

{"foo" : {"bar" : "barValue"}}
Run Code Online (Sandbox Code Playgroud)

这似乎与a.)其他语言的关联,b.)(更重要的是)javascript的作用.

假设我在Javascript中定义了相同的类foo:

var fooInstance = new Foo();
fooInstance.bar = "barValue";
Run Code Online (Sandbox Code Playgroud)

然后我使用一个Javascript JSON库(例如https://github.com/douglascrockford/JSON-js)对其进行字符串化.然后输出是这样的:

{"bar" : "barValue" }
Run Code Online (Sandbox Code Playgroud)

但是我的控制器方法的输入(以及输出)期望:

{"foo" : {"bar" : "barValue"}
Run Code Online (Sandbox Code Playgroud)

所以我必须沿着这些行编写代码才能使它工作:

var fooInstance = new Foo();
fooInstance.bar = "barValue";
var dummyObjectToKeepRailsHappy = { foo : fooInstance};
Run Code Online (Sandbox Code Playgroud)

所以我做Rails序列化不正确吗?或者它有这样的原因吗?

Mar*_*rth 9

to_json 这里阅读有关Rails的文档.

ActiveRecord :: Base.include_root_in_json选项控制to_json的顶级行为.在新的Rails应用程序中,它在initializers/new_rails_defaults.rb中设置为true.如果为true,to_json将发出以对象类型命名的单个根节点.

所以添加到您的环境/ application.rb

config.active_record.include_root_in_json = true
Run Code Online (Sandbox Code Playgroud)

应该解决你的问题.