67 votes

Ruby on Rails - Rendu JSON pour plusieurs modèles

Je suis en train de rendre les résultats de plus d'un modèle en JSON. Le code suivant dans mon contrôleur rend seulement 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 grandement apprécié, merci.

94voto

Ryan Brunner Points 8983

Une manière de faire cela est de créer un hash avec les objets que vous souhaitez afficher, et de passer ensuite que la méthode render. Comme suit:

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

Si les modèles ne sont pas associés par le biais d'active record, c'est probablement votre meilleure solution.

Si une association n'existe pas, vous pouvez passer un :include argument de la file d'appel, comme suit:

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

Notez que vous n'auriez pas à récupérer l' @material_costs variable dans la section ci-dessus si vous prenez cette approche, Rails va automatiquement charger à partir de la @moulding variable.

8voto

iain Points 11602

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

Comment à ce sujet:

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

2voto

Bernard Banta Points 448

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, il est de travail

Merci les gars

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X