web-dev-qa-db-ja.com

Ruby on Rails-複数のモデルのJSONをレンダリングする

JSONで複数のモデルの結果をレンダリングしようとしています。コントローラーの次のコードは、最初の結果セットのみをレンダリングします。

  def calculate_quote
    @moulding = Moulding.find(params[:id])
    @material_costs = MaterialCost.all

    respond_to do |format|
      format.json  { render :json => @moulding }
      format.json  { render :json => @material_costs }
    end
  end

どんな助けでも大歓迎です、ありがとう。

65
freshest

これを行う1つの方法は、レンダリングするオブジェクトでハッシュを作成し、それをrenderメソッドに渡すことです。そのようです:

respond_to do |format|
  format.json  { render :json => {:moulding => @moulding, 
                                  :material_costs => @material_costs }}
end

モデルがアクティブなレコードを介して関連付けられていない場合は、おそらくそれが最善のソリューションです。

関連付けが存在する場合、次のように、:include引数をrender呼び出しに渡すことができます。

respond_to do |format|
  format.json  { render :json => @moulding.to_json(:include => [:material_costs])}
end

このアプローチをとる場合、上のセクションで@material_costs変数を取得する必要がないことに注意してください。Railsは@moulding変数から自動的にロードします。

91
Ryan Brunner

コントローラーは1つの応答のみを返すことができます。これらすべてのオブジェクトを送り返す場合は、1つのJSONオブジェクトに入れる必要があります。

どうですか:

def calculate_quote
  @moulding = Moulding.find(params[:id])
  @material_costs = MaterialCost.all
  response = { :moulding => @moulding, :material_costs => @material_costs }
  respond_to do |format|
    format.json  { render :json => response }
  end
end
8
iain

私は次のようなことをしました

respond_to do |format|
      format.html # show.html.erb
      format.json { render :json => {:cancer_type => @cancer_type, :cancer_symptoms => @cancer_symptoms }}

結果はこちら

{"cancer_type":{"created_at":"2011-12-31T06:06:30Z","desc":"dfgeg","id":2,"location":"ddd","name":"edddd","sex":"ddd","updated_at":"2011-12-31T06:06:30Z"},"cancer_symptoms":[]}

だからそれは働いています

君たちありがとう

2
Bernard Banta