2010-11-30 23 views
56

Estoy intentando representar los resultados de más de un modelo en JSON. El siguiente código en mi controlador solo muestra el primer conjunto de resultados:Ruby on Rails - Renderizar JSON para varios modelos

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 

Cualquier ayuda sería muy apreciada, gracias.

+0

preguntas excelentes - ¡gracias! – jpwynn

Respuesta

80

Una forma de hacerlo es crear un hash con los objetos que desea representar, y luego pasarlo al método de renderizado. Como lo siguiente:

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

Si los modelos no están asociados a través de registros activos, esa es probablemente la mejor solución.

Si existe una asociación, se puede pasar un argumento :include a la llamada render, de este modo:

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

Tenga en cuenta que no tiene que recuperar la variable @material_costs en el apartado anterior si se toma este enfoque, Rails lo cargará automáticamente desde la variable @moulding.

+0

Usó su sugerencia también después de encontrar esta publicación. Mis modelos sí tienen una asociación, pero fui con tu primer ejemplo porque siento que se lee mejor. ¡Gracias! – Tass

7

Un controlador solo puede devolver una respuesta. Si desea devolver todos estos objetos, debe colocarlos en un objeto JSON.

¿Qué tal:

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 
1

que hice algo así como

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

aquí es el resultado

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

Por lo tanto, está trabajando

Gracias chicos