【问题标题】:Include root node in JSON output In Rails 4在 Rails 4 中的 JSON 输出中包含根节点
【发布时间】:2014-07-07 22:22:08
【问题描述】:

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。同样,没有影响。

最后,我尝试在“书”模型中覆盖 as_json,但没有看到任何效果。

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

谢谢!

【问题讨论】:

  • wrap_parameters.rb 文件修改后是否重启服务器?
  • 是的,每次更改后我都重新启动了。

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


【解决方案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】:

Book.first(3).to_json(:root => true) 应该可以解决问题

或者,您需要取消 3 行的注释

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

然后重启服务器

编辑

在 Book 模型中添加以下内容

def as_json(options = nil)
    options = {:root => true}
    super(options)
end

【讨论】:

  • 我上面的帖子不正确,我已经修复了它。 wrap_parameters.rb 中的 3 行未注释。你能扩展你的第一行吗? Book.first(3).to_json(:root => true) 我会在哪里改变它?谢谢
  • 首先在控制台中运行Book.first(3).to_json(:root => true),看看是否得到正确的结果。
  • 不幸的是,没有。我得到了:[{\"name\":\"One Flew Over The Cuckoo's Nest\"},{\"name\":\"The Great Gatsby\"}]
  • 我在关闭控制台后重试,似乎成功了。我得到了:[{\"book\":{\"id\":1,\"name\":\"One Flew Over The Cuckoo's Nest\",\"created_at\":\"2014-07-07T21:43:55.666Z\",\"updated_at\":\"2014-07-07T21:43:55.666Z\"}},{\"book\":{\"id\":2,\"name\":\"The Great Gatsby\",\"created_at\":\"2014-07-07T21:44:05.235Z\",\"updated_at\":\"2014-07-07T21:44:05.235Z\"}}] 感谢您的帮助!
  • 其实还有一个问题:我应该把那一行放在 books_controller.rb 内的“show”中的什么位置?
【解决方案3】:

它可能是 gem active_model_serializers 的版本。我遇到了同样的问题,但在我的 Gemfile 中切换到了不同的 gem 版本:

'gem active_model_serializers', '~>0.9.0'

并将其添加到我的 config/application.rb

config.active_record.include_root_in_json = true

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多