RoR noob here ...我有一个非常基本的应用程序(Ruby 2.1.2; Rails 4.1.2),我已经生成了一个脚手架并且只有默认的CRUD表单。我可以输入并检索值没有问题。但是,我真正需要的是JSON。当我访问http://rob.com:3000/books.json时,我得到:
[
{"id":1,"name":"One Flew Over The Cuckoo's Nest","url":"http://rob.com:3000/books/1.json"},
{"id":2,"name":"The Great Gatsby","url":"http://rob.com:3000/books/2.json"}
]
我真正想要的是一个“书”根节点:
{
"books": [
{
"id": 1,
"name": "One Flew Over The Cuckoo's Nest",
"url": "http://rob.com:3000/books/1.json"
},
{
"id": 2,
"name": "The Great Gatsby",
"url": "http://rob.com:3000/books/2.json"
}
]
}
我已经通过Google和SO挖掘并且没有看到解决方案。第一个看起来最明显的是取消注释config \ initializers \ wrap_parameters.rb中的以下行
# To enable root element in JSON for ActiveRecord objects.
ActiveSupport.on_load(:active_record) do
self.include_root_in_json = true
end
这似乎没有效果。我也尝试使用这里描述的Active Model Serializer:http://railscasts.com/episodes/409-active-model-serializers?view=asciicast。再一次,没有影响。
最后,我尝试在'book'模型中覆盖as_json,但没有看到效果。
关于我缺少什么的任何建议?
谢谢!
答案 0 :(得分:1)
Book.first(3).to_json(:root => true)
应该做的伎俩
或者,您需要推荐3行
ActiveSupport.on_load(:active_record) do
self.include_root_in_json = true
end
然后重启服务器
修改
在Book model中添加以下内容
def as_json(options = nil)
options = {:root => true}
super(options)
end
答案 1 :(得分:1)
您正在使用Rails 4,因此您可以使用Jbuilder:
其中@books
是AR::Relation
:
Jbuilder.new do |json|
json.set!(@books.table_name) do
json.array! @books, :id, :name, :url
end
end.attributes!
这将生成适合呈现为json的Ruby哈希(或者您可以调用target!
而不是attributes!
来直接呈现JSON字符串)。如果要用作JBuilder模板,只需在模板文件中包含中间3行。
答案 2 :(得分:0)
它可能是gem active_model_serializers的版本。我遇到了同样的问题,但在我的Gemfile中切换到了不同的gem版本:
'gem active_model_serializers', '~>0.9.0'
以及将此添加到我的config / application.rb
config.active_record.include_root_in_json = true
请不要忘记在进行上述更改后重新启动服务器。