Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript RubyonRails-呈现JSON_Javascript_Ruby On Rails_Json - Fatal编程技术网

Javascript RubyonRails-呈现JSON

Javascript RubyonRails-呈现JSON,javascript,ruby-on-rails,json,Javascript,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 @

我有以下控制器:

@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"}}}

我想这样做的原因是,我可以通过
id
从JSON字符串中提取特定
id
的数据。如何重新格式化呈现的JSON?

在我最初的回答中,我错误地假设@molding是一个单独的对象,而实际上它是一组对象。如果是那样的话,答案就行了。要对模塑件执行所需操作,必须重新包装对象集。看起来是这样的:

@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
方法将迭代您拥有的模具集中的所有项目,并将返回值放入一个新数组中。
收集方法在适当的位置执行此操作(修改正在处理的数组)。如果你想把它分配给一个新的变量,那很好

基本上,我将造型对象转换为一组散列。最终的输出看起来像您想要的


旧答案:

似乎您要做的是将代码中的
:type
键更改为项目id。示例:

format.json { render :json => { @moulding.id => @moulding, :mount => @mount, :glass => @glass, :backing_board => @backing_board, :vat => @vat, :wastage => @wastage, :markup => @markup } }
我不太确定如何抑制头顶上的ID,但重复ID不会有任何伤害


注意:模塑键名称使用的是
@
前缀,而不是之前的符号。这是一个非常微妙且容易被忽略的细节。

@Berin Loritsch-使用
@molding.id
会给出一个错误
未定义的方法
id'`。您确定使用
@
而不是
?我希望
:molding.id
会抛出那个错误。@Berin Loritsch-是的,我正在使用
@molding.id=>@molding
@我最新的问候语。我对
@modeling
变量的内容做了错误的假设。我已经更新了答案,以反映我对价值的更好理解,并保留了原始答案和注释的上下文。