2015-07-21 116 views
2

我有以下嵌套哈希:发送红宝石后嵌套哈希

$installation_settings = { 
    :lat => "43.107044", 
    :lon => "25.194757", 
    :country => "Poland", 
    :collector_installation => { 
     :people => 3, 
     :deviation_from_s => 5, 
     :solar_collector_id => 1, 
     :collectors_number => 2, 
     :monthly_water_consumption => 6000, 
     :gas_price => 0.09, 
     :electricity_price => 0.87    
    } 
} 

其中我试图通过邮局用红宝石派:

url = "someURL" 
uri = URI(url) 
res = Net::HTTP.post_form(uri, $installation_settings) 
puts res.body 

的Net :: HTTP.post_form只允许发送简单的哈希(没有嵌套),所以我最终得到反斜杠的字符串。

我该如何发送?

+0

通常这个数据被发送为JSON,但目前还没有足够的信息来表明,在这种特殊情况下以适当的方式。 – mudasobwa

+1

我发现像这样['HTTParty'](https://github.com/jnunemaker/httparty)这样简单的事情,gem做得非常出色。 – engineersmnky

回答

2

The docs表示散列必须为string: string格式。所以一个嵌套哈希看起来像:

Net::HTTP.post_form(URI('http://localhost'), 'a': { 'b': '2' }) 
=> #<Net::HTTPOK 200 OK readbody=true> 
+0

你确定它提到'string:string'格式吗?对我来说它说它应该是一个从String到String的哈希映射。 ''a':{'b':'2'}'不是Ruby中的有效Hash,我认为它应该是:''a'=> {'b'=>'2'}'。 – limekin

+1

在Ruby 2.2.2中,'{'a':'2'}'是一个有效的散列。弦乐钥匙不再需要哈希火箭。 – Anthony

+0

啊,你是对的,太糟糕了,我没有跟踪变化。 – limekin

0

我正在与Ruby的旧版本,所以不幸我不能应用安东尼的答案。然而,我发现另一种解决方案可能帮助别人:

uri = URI(url) 
http = Net::HTTP.new(uri.host, uri.port) 
http.use_ssl = false 
request = Net::HTTP::Post.new(uri.path, {'Content-Type' =>'application/json'}) 
request.body = installation_hash.to_json 
response = http.request(request)