1

@article と @profile という 2 つのオブジェクトがあります。Article はモデルで、@profile は Struct です。最終的に、次のような 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 はオブジェクトを 2 つの手順でシリアル化します。最初に呼び出しas_jsonてシリアル化するオブジェクトを作成し、次に呼び出しto_jsonて実際に JSON 文字列を作成します。

一般に、モデルを JSON で表現する方法をカスタマイズする場合は、オーバーライドするのが最善as_jsonです。プロファイル構造体が仮想属性 (つまり、db に保存されずに定義されている) であると仮定すると、モデルattr_accessorでこれを行うことができます。Article

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

それが役立つことを願っています。以下も参照してください。

于 2013-02-11T23:49:36.527 に答える
2

塩山の正解に加えて、rabl を使用して JSON オブジェクトを作成できます。ERBがビューに対して機能するのと同様です。

たとえば、「ビュー」を作成しますindex.rabl。次のようになります。

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