web-dev-qa-db-fra.com

Ruby on Rails - Rendu JSON pour plusieurs modèles)

J'essaie de rendre les résultats de plusieurs modèles en JSON. Le code suivant dans mon contrôleur ne rend que le premier jeu de résultats:

  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

Toute aide serait très appréciée, merci.

65
freshest

Pour cela, vous pouvez créer un hachage avec les objets que vous souhaitez rendre, puis les transmettre à la méthode de rendu. Ainsi:

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

Si les modèles ne sont pas associés via un enregistrement actif, c'est probablement votre meilleure solution.

Si une association existe, vous pouvez passer un :include argument à l'appel de rendu, comme ceci:

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

Notez que vous n'auriez pas à récupérer le @material_costs variable dans la section ci-dessus si vous adoptez cette approche, Rails le chargera automatiquement à partir du @moulding variable.

91
Ryan Brunner

Un contrôleur ne peut renvoyer qu'une seule réponse. Si vous souhaitez renvoyer tous ces objets, vous devez les placer dans un seul objet JSON.

Que diriez-vous:

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

J'ai fait quelque chose comme

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

voici le résultat

{"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":[]}

Donc ça marche

Merci les gars

2
Bernard Banta