在Rails 4中包含JSON输出中的根节点

时间:2014-07-07 22:22:08

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

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,但没有看到效果。

关于我缺少什么的任何建议?

谢谢!

3 个答案:

答案 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:

其中@booksAR::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

请不要忘记在进行上述更改后重新启动服务器。