2010-12-07 207 views
5

我有以下的控制器:Ruby on Rails的 - 渲染JSON

@moulding = Moulding.find(params[:id].split(","), :select => 'id, cost, width') 
@mount = MaterialCost.find(1).cost_per_square_mm 
@glass = MaterialCost.find(2).cost_per_square_mm 
@backing_board = MaterialCost.find(3).cost_per_square_mm 
@vat = AppOption.find(1, :select => 'value') 
@wastage = AppOption.find(2, :select => 'value') 
@markup = AppOption.find(3, :select => 'value') 

respond_to do |format| 
    format.json { render :json => { :moulding => @moulding, :mount => @mount, :glass => @glass, :backing_board => @backing_board, :vat => @vat, :wastage => @wastage, :markup => @markup } } 
end 

的JSON輸出如下:

{"moulding":[{"moulding":{"cost":"3.1","id":2,"width":45}},{"moulding":{"cost":"1.5","id":4,"width":30}},{"moulding":{"cost":"2.1","id":6,"width":50}}],"mount":"0.00000246494303242769","glass":"0.0000032426589803639","backing_board":"0.00000135110790848496","vat":{"app_option":{"value":"17.5"}},"wastage":{"app_option":{"value":"20"}},"markup":{"app_option":{"value":"3"}}} 

我想JSON是在以下格式:

{"mouldings":[{"2":{"cost":"3.1","width":45}},{"4":{"cost":"1.5","width":30}},{"6":{"cost":"2.1","width":50}}],"mount":"0.00000246494303242769","glass":"0.0000032426589803639","backing_board":"0.00000135110790848496","vat":{"app_option":{"value":"17.5"}},"wastage":{"app_option":{"value":"20"}},"markup":{"app_option":{"value":"3"}}} 

我想這樣做的原因是我可以通過提取特定moulding的數據來自JSON字符串的。我如何重新格式化呈現的JSON?

回答

3

在我最初的回答中,我做了一個錯誤的假設,即@moulding是一個單一的對象,實際上它是一組對象。在這種情況下,答案是有效的。要做你想要的模具,你將不得不重新包裝的對象。這將是這樣的:

@moulding.collect! do |moulding| 
    { moulding.id => {:cost=>moulding.cost, :width=>moulding.width}} 
end 

respond_to do |format| 
    format.json { render :json => { :moulding => @moulding, :mount => @mount, :glass => @glass, :backing_board => @backing_board, :vat => @vat, :wastage => @wastage, :markup => @markup } } 
end 

collect方法會遍歷集合中的你有角線的所有項目,並把返回值放入你的新數組。 collect!方法就是這樣做的(修改你正在處理的數組)。如果你想把它分配給一個新的變量,那很好。

本質上,我把成型對象變成了一組散列。最終的輸出看起來像你想要的。


老答案:

看來,你想要做的就是在你的代碼的:moulding鍵更改爲項目ID。例如:

format.json { render :json => { @moulding.id => @moulding, :mount => @mount, :glass => @glass, :backing_board => @backing_board, :vat => @vat, :wastage => @wastage, :markup => @markup } } 

我不完全確定如何將ID從頭頂壓低,但重複ID不應該傷害任何東西。

注意:模型鍵名稱使用@前綴,而不是前面的符號。這是一個非常微妙和容易被忽視的細節。

+0

@Berin Loritsch - 使用`@ moulding.id`會給出錯誤`undefined method`id'`。 – freshest 2010-12-07 15:52:18