【问题标题】:Ruby on Rails - Render JSONRuby on Rails - 渲染 JSON
【发布时间】:2010-12-07 15:41:35
【问题描述】:

我有以下控制器:

@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 字符串中提取特定 moulding 的数据。如何重新格式化呈现的 JSON?

【问题讨论】:

    标签: javascript ruby-on-rails json


    【解决方案1】:

    在我最初的回答中,我错误地假设@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 应该不会造成任何伤害。

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

    【讨论】:

    • @Berin Loritsch - 使用 @moulding.id 会产生错误 undefined method id'`。
    • 你确定你有@而不是:吗?我希望:moulding.id 会抛出该错误。
    • @Berin Loritsch - 是的,我正在使用@moulding.id => @moulding
    • @freshest,我的道歉。我对@moulding 变量的内容做出了错误的假设。我更新了答案,以反映我对价值的更好理解,并保留原始答案以了解 cmets 的上下文。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 2013-06-24
    • 2010-11-10
    • 2017-05-07
    • 1970-01-01
    • 2019-09-25
    • 2018-06-25
    相关资源
    最近更新 更多