fre*_*est 5 javascript json ruby-on-rails
我有以下控制器:
@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
Run Code Online (Sandbox Code Playgroud)
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"}}}
Run Code Online (Sandbox Code Playgroud)
我希望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"}}}
Run Code Online (Sandbox Code Playgroud)
我想这样做的原因是这样我就可以提取特定的数据moulding通过id从JSON字符串.如何重新格式化渲染的JSON?
在我最初的回答中,我错误地假设 @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
Run Code Online (Sandbox Code Playgroud)
该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 } }
Run Code Online (Sandbox Code Playgroud)
我不太确定如何将这个 ID 从我的脑海中隐藏起来,但是重复这个 ID 应该不会有什么坏处。
注意:成型键名称使用@前缀而不是之前的符号。这是一个非常微妙且容易被忽视的细节。
| 归档时间: |
|
| 查看次数: |
3419 次 |
| 最近记录: |