2010-11-30 60 views
56

我想呈現來自JSON中多個模型的結果。在我的控制器中的以下代碼只呈現第一個結果集:Ruby on Rails - 爲多個模型呈現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 

任何幫助將不勝感激,謝謝。

+0

優秀的問題 - 謝謝! – jpwynn 2012-06-13 17:39:48

回答

80

你可以做到這一點的一種方法是與你想渲染的對象創建一個散列,然後將它傳遞給渲染方法。像這樣:

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變量中加載它。

+0

找到這篇文章後也使用了你的建議。我的模特確實有聯繫,但是我認爲它會更好。謝謝! – Tass 2012-03-28 18:40:39

7

控制器只能返回一個響應。如果你想發回所有這些對象,你必須把它們放在一個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 
1

我不喜歡的東西

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

所以它正在

謝謝你們