1

我有两个对象,一个@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 对象而不必手动这样做,那就太好了......有什么帮助吗?谢谢!

4

2 回答 2

2

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

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

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

希望有帮助。也可以看看:

于 2013-02-11T23:49:36.527 回答
2

除了 shioyama 的正确答案之外,您还可以使用rabl来制作您的 JSON 对象,类似于 ERB 用于视图的方式。

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

collection @articles
attributes :author, :title
child(:profile) { attributes :first_name, :last_name }
于 2013-02-12T00:03:28.450 回答