Rails生成嵌套JSON

时间:2013-02-11 23:31:20

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

我有两个对象,一个@article和一个@profile。文章是一个模型,@ profile是一个结构。我想最终得到一些看起来像这样的JSON:

{
    "article": {
        "title": "this is a title",
        "author": "Author McAuthor",
        "profile": {
            "first_name": "Bobby",
            "last_name": "Fisher"
        }
    }
}

截至目前,我可以通过以下方式手动创建:

@json = { article: { title: @article.title, author: @article.author, profile: { first_name: @profile.first_name, last_name: @profile.last_name } }}

我觉得用这种方式构建json对象有点粗糙,每次我更改作者模型时,我可能都要更改此代码。如果我能找到一种更简单的方法来构建这些json对象而不必手动执行它会很棒...任何帮助?谢谢!

2 个答案:

答案 0 :(得分:2)

Rails分两步序列化对象,首先调用as_json创建要序列化的对象,然后通过调用to_json来实际创建JSON字符串。

通常,如果要自定义模型在JSON中的表示方式,最好覆盖as_json。假设您的个人资料结构是虚拟属性(即使用attr_accessor定义,未保存在数据库中),您可以在Article模型中执行此操作:

def as_json(options = {})
  super((options || {}).merge({
    :methods => :profile
  }))
end

希望有所帮助。另见:

答案 1 :(得分:2)

除了shioyama的正确答案,您还可以使用rabl来制作JSON对象,类似于ERB如何为视图工作。

例如,您可以创建一个“视图”,例如index.rabl。它看起来像是:

collection @articles
attributes :author, :title
child(:profile) { attributes :first_name, :last_name }