哈希火箭vs渲染json中的冒号:

时间:2016-11-09 17:41:11

标签: ruby-on-rails json api hash

我正在回复来自webhook的POST请求。我刚刚意识到,当我render json: thingee并且我记录thingee时,它的哈希火箭是无效的json。

我已经看到人们在puts哈希的地方看起来很好,但这不是我正在做的事情,我在回复POST时将哈希渲染为JSON ..

渲染时,我的哈希看起来像这样:

{"rates"=>[{"service_name"=>"Standard", "service_code"=>"f48",
"total_price"=>"390",},{"service_name"=>"Expedited", "service_code"=>"f34", 
"total_price"=>"640"}]}

但我需要它是有效的JSON,看起来像这样:

{"rates":[{"service_name":"Standard", "service_code":"f48",
"total_price":"390",},{"service_name":"Expedited", "service_code":"f34", 
"total_price":"640"}]}

由于

1 个答案:

答案 0 :(得分:2)

不要太在意这件事。它非常好。

在Ruby中,只要你想要一个不是符号的散列键,就需要使用hashrocket语法:

irb(main):002:0> { foo: 1, 'baz': 2 }
=> {:foo=>1, :baz=>2} # coerces 'baz' into a symbol
irb(main):003:0> { foo: 1, 'baz' => 2 }
=> {:foo=>1, "baz"=>2}

然而,当您传递散列render: { json: @foo }时,散列将传递给JSON.generate,后者将ruby散列转换为有效的JSON。

irb(main):006:0> JSON.generate({ "foo" => 1, "baz" => 2 })
=> "{\"foo\":1,\"baz\":2}"
irb(main):007:0> JSON.generate({ foo: 1, baz: 2 })
=> "{\"foo\":1,\"baz\":2}"
irb(main):008:0> { foo: 1, baz: 2 }.to_json
=> "{\"foo\":1,\"baz\":2}"