首页 > 解决方案 > 在控制器中使用渲染 json 时,动态生成的哈希键无法正确显示

问题描述

render json:没有正确显示我的哈希键,我不确定为什么。我将在下面发布控制器代码和视图输出。

    merger = {}

    stops = OpsHeader.joins(
        ops_stop_rec: :driver_header
      )
    .select(
        :pb_net_rev,
        :pbbname,
        :ops_driver1,
        :pb_id,
        :ops_stop_id,
        :dh_first_name,
        :dh_last_name
      )
      .where(
        :ops_stop_rec => {
            ops_arrive_time: params[:startDate] .. params[:endDate]
        })


    OpsStopRec.joins(
        :ops_line_items
      ).select(
        :opl_amount,
        :ops_type,
        :ops_stop_id,
        :ops_order_id,
        :ops_driver1
      )
      .where(
        :ops_stop_rec => {
            ops_arrive_time: params[:startDate] .. params[:endDate]
        }
      ).each do |lines|
        stops.each do |stop|
          if (lines.ops_stop_id == stop.ops_stop_id && lines.ops_driver1 == stop.ops_driver1)
              merger[stop] = (merger[stop] ||= []) << lines
          end
          if (!merger.key?(stop))
              merger[stop] = merger[stop]
          end
        end
      end

render json: merger

这是我的实际输出render json:

#<OpsHeader:0x0a61cdd8>: [
{
ops_stop_id: 260772,
ops_order_id: "129215.0",
ops_type: "P",
ops_driver1: 97,
opl_amount: "625.0"
},
{
ops_stop_id: 260772,
ops_order_id: "129215.0",
ops_type: "P",
ops_driver1: 97,
opl_amount: "112.5"
}
],

如果我循环记录集合并将循环元素用作merger哈希中的键,为什么它仍然无法在视图中正确显示?

奇怪的是values,您看到的也来自循环collection,但它们似乎正确显示。它将在视图中正确显示,binding.pry()但不在视图中。

有任何想法吗?

让我给你一个更好的例子来说明我所指的是什么。这接近我想要的,但它仍然没有渲染到json. 在这种情况下,我使用该attributes方法来显示key

{"pb_id"=>0.133204e6, "pbbname"=>"AMARR INC", "pb_net_rev"=>0.24259e4, "ops_driver1"=>61, "ops_stop_id"=>268970, "dh_first_name"=>"MARK", "dh_last_name"=>"STAYTON"}: null,
{"pb_id"=>0.133203e6, "pbbname"=>"AMARR INC", "pb_net_rev"=>0.251647e4, "ops_driver1"=>89, "ops_stop_id"=>268966, "dh_first_name"=>"RICHARD", "dh_last_name"=>"STROEMER"}: null,
{"pb_id"=>0.133203e6, "pbbname"=>"AMARR INC", "pb_net_rev"=>0.251647e4, "ops_driver1"=>89, "ops_stop_id"=>268967, "dh_first_name"=>"RICHARD", "dh_last_name"=>"STROEMER"}: null,
{"pb_id"=>0.133203e6, "pbbname"=>"AMARR INC", "pb_net_rev"=>0.251647e4, "ops_driver1"=>89, "ops_stop_id"=>268968, "dh_first_name"=>"RICHARD", "dh_last_name"=>"STROEMER"}: null,
{"pb_id"=>0.133204e6, "pbbname"=>"AMARR INC", "pb_net_rev"=>0.24259e4, "ops_driver1"=>61, "ops_stop_id"=>268971, "dh_first_name"=>"MARK", "dh_last_name"=>"STAYTON"}: null,
{"pb_id"=>0.133204e6, "pbbname"=>"AMARR INC", "pb_net_rev"=>0.24259e4, "ops_driver1"=>61, "ops_stop_id"=>268972, "dh_first_name"=>"MARK", "dh_last_name"=>"STAYTON"}: null,
{"pb_id"=>0.133204e6, "pbbname"=>"AMARR INC", "pb_net_rev"=>0.24259e4, "ops_driver1"=>61, "ops_stop_id"=>268973, "dh_first_name"=>"MARK", "dh_last_name"=>"STAYTON"}: [
{
ops_stop_id: 268973,
ops_order_id: "133204.0",
ops_type: "P",
ops_driver1: 61,
opl_amount: "2375.9"
},
{
ops_stop_id: 268973,
ops_order_id: "133204.0",
ops_type: "P",
ops_driver1: 61,
opl_amount: "50.0"
},
{
ops_stop_id: 268973,
ops_order_id: "133204.0",
ops_type: "P",
ops_driver1: 61,
opl_amount: "0.0"
}

如您所见,有些是嵌套的,有些是有null值的,这很好。

标签: ruby-on-railsjsonruby

解决方案


所以在 JSON 格式中,一个键必须是一个字符串。只是 ruby​​ 允许您拥有几乎任何东西作为哈希的键,但这并不意味着它将与 JSON 标准兼容。我会建议您更改数据的格式,以便您可以生成如下内容:

# It is JSON, not ruby 
{
  "ops_headers": [ # each of your OpsHeader instances
    { 
      "pb_id": 133204,
      "pbbname": "AMARR INC",
      "pb_net_rev": 2425.9,
      "ops_driver1": 61,
      "ops_stop_id": 268970,
      "dh_first_name": "MARK",
      "dh_last_name": "STAYTON",
      "ops_stop_recs": [ # contains array of their OpsStopRec instances
        {
          "ops_stop_id": 268973,
          "ops_order_id": "133204.0",
          "ops_type": "P",
          "ops_driver1": 61,
          "opl_amount": "2375.9"
        },
        {
          "ops_stop_id": 268973,
          "ops_order_id": "133204.0",
          "ops_type": "P",
          "ops_driver1": 61,
          "opl_amount": "2375.9"
        }
      ]
    }
  ]
}

推荐阅读