2015-07-21 115 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)