Ruby on Rails - Render JSON for multiple models
I am trying to render results from more than one model in JSON. The following code in my con开发者_JAVA技巧troller only renders the first result set:
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
Any help would be much appreciated, thanks.
One way you could do this is to create a hash with the objects you want to render, and then pass that to the render method. Like so:
respond_to do |format|
format.json { render :json => {:moulding => @moulding,
:material_costs => @material_costs }}
end
If the models aren't associated through active record, that's probably your best solution.
If an association does exist, you can pass an :include
argument to the render call, like so:
respond_to do |format|
format.json { render :json => @moulding.to_json(:include => [:material_costs])}
end
Note that you wouldn't have to retrieve the @material_costs
variable in the section above if you take this approach, Rails will automatically load it from the @moulding
variable.
A controller can only return one response. If you want to send all these objects back, you have to put them in one JSON object.
How about:
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
I did something like
respond_to do |format|
format.html # show.html.erb
format.json { render :json => {:cancer_type => @cancer_type, :cancer_symptoms => @cancer_symptoms }}
here is the result
{"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":[]}
So it is working
Thank you guys
Not seeing a more complex example I wanted to throw in the following.
def calculate_quote
moulding = Moulding.find(params[:id])
material_costs = MaterialCost.all
respond_to do |format|
# there times you'll need multiple formats, no need to overuse instance vars:
format.html do
@moulding = moulding
@material_costs = material_costs
end
format.json do
# in case of as_json, you can provide additional options
# to include associations or reduce payload.
moulding_json = moulding.as_json
material_costs_json = material_costs.as_json
render json: {
moulding: moulding_json,
material_costs: material_costs_json
}
end
end
end
精彩评论