2010-12-07 146 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