13

私はこのようになります私のフロントエンド・アプリケーション・JSON送信しようとしている:私は 使用ActiveModel ::シリアライザ2つの親のJSON配列を含むように

render :json => @facilities 

試してみました

{ 
    facilities: [ 
    {id: 5, name: 'happy days ranch', location: { address: '1424 Pastoral Lane', zipcode: '25245'}, instructor_ids: [2, 4, 9]} 
    ], 
    instructors: [ 
    {id: 4, name: 'Johnny Pheonix', skill: '8', picture: 'aws_url', facility_ids: [5, 8, 12} 
    ] 
} 

物事をシリアライザがこれを検出します。わーい!これは任意のインストラクター

render :json => {facilities: @facilities, instructors: @instructors} 

が含まれていませんが、これは私のインストラクター配列や設備の配列を与えるが、activeModel ::シリアライザが使用されていません。まず

render :json => [@facilities, @instructors] 

それは私に二つの配列を与えた、そしてそれはActiveModel ::シリアライザを使用するので、私は、この1について興奮していました。しかし、これはJSONのようなものです:

{facilities: [ 
    {facilities: [ 
    #my facilities data 
    ]}, 
    {facilities: [ 
    #my instructor data 
    ]} 
]} 

私はActiveModel :: Serializersでも許可しようとしていますか?もしそうなら、どうですか?

ありがとうございます!

答えて

20

私はActiveModel

class Search 
    include ActiveModel::Serialization 
    include ActiveModel::SerializerSupport 

    attr_accessor :facilities, :instructors 

    def initialize(facilities, instructors) 
    @facilities, @instructors = facilities, instructors 
    end 
end 

の態様はその後、私は検索コントローラ(そこに何も面白い)と検索シリアライザを作成取り入れたクラスと呼ばれる検索を作成することによって、それを解決しました。

class SearchSerializer < ActiveModel::Serializer 
    has_many :instructors, embed: :objects 
    has_many :facilities, embed: :objects 
end 

今それが検索ハッシュに包まれているが、これは、私の希望JSONを作成します。

{search: { 
    #the stuff I wanted 
}} 
+0

これはまったく同じ問題です。素晴らしい答えをありがとう! –

+2

ありがとうございます。これは動作し、レンダラーで 'root:false'を設定することでルートノードの検索を無効にすることができます。レビュー後、2つのルート要素でこのアプローチを使用しないことにしました.2つの別々のAPIエンドポイントを使用することになり、設計が簡単になりました。 –

7

これは私のソリューションです:

render json: { 
    facilities: ActiveModel::ArraySerializer.new(@facilities, each_serializer: FacilitySerializer, root: false), 
    instructors: ActiveModel::ArraySerializer.new(@instructors, each_serializer: InstructorSerializer, root: false) 
} 

それは少し汚いです。これは基本的には、手動と2回を除いてインスタンス化されるものをインスタンス化します。両方の結果セットは、ActiveModel :: Serializersを正しい形式で使用してレンダリングされます。

+1

active_model_serializersへの最近のアップデート以降、このソリューションはもはや有効ではありません。アプリケーションは2つの別々の要求を行う必要があります。 – kequc

+0

私はちょうどあなたのコメントに興味があります、なぜこれはもはや有効ではありません?私は最新バージョンを使用しており、すべてがスムーズに動作します。 – David

+0

私はこのソリューションを投稿して以来、ソースへのリンクの形で多くの追加情報を提供することが非常に重要であることを知りました。残念ながら私はその時あなたが話していたことを解読することはできません。もっと冗長ではないことをお詫びし、将来的にはもっとそうなるでしょう。私は、アクティブモデルのシリアライザがアウトプットの見栄えやいくつかの外部ライブラリとの非互換性をどのように期待しているかと考えています。必要なのは生の出力だけですが、この解決策はまだ有効です。 – kequc

関連する問題