Ruby on Rails - Render 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
Любая помощь будет очень благодарна, спасибо.
Ответы
Ответ 1
Один из способов сделать это - создать хэш с объектами, которые вы хотите визуализировать, а затем передать это методу рендеринга. Например:
respond_to do |format|
format.json { render :json => {:moulding => @moulding,
:material_costs => @material_costs }}
end
Если модели не связаны активной записью, возможно, это лучшее решение.
Если существует ассоциация, вы можете передать аргумент :include
вызову рендеринга, например:
respond_to do |format|
format.json { render :json => @moulding.to_json(:include => [:material_costs])}
end
Обратите внимание, что вам не нужно будет извлекать переменную @material_costs
в приведенном выше разделе, если вы примете этот подход, Rails автоматически загрузит его из переменной @moulding
.
Ответ 2
Контроллер может возвращать только один ответ. Если вы хотите отправить все эти объекты обратно, вы должны поместить их в один объект 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
Ответ 3
Я сделал что-то вроде
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":[]}
Итак, он работает
Спасибо, ребята,