我有两个对象,一个@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对象而不必手动执行它会很棒...任何帮助?谢谢!
答案 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 }