2015-10-21 29 views
5

如何通過傳遞散列構造具有查詢參數的URI對象?如何使用Ruby中的散列查詢參數構造URI

我可以生成與查詢:

URI::HTTPS.build(host: 'example.com', query: "a=#{hash[:a]}, b=#{[hash:b]}")

產生

https://example.com?a=argument1&b=argument2

但是我認爲構建查詢字符串許多論證會無法讀取,難以維護。我想通過傳遞散列構造查詢字符串。就像下面的例子中:

hash = { 
    a: 'argument1', 
    b: 'argument2' 
    #... dozen more arguments 
} 
URI::HTTPS.build(host: 'example.com', query: hash) 

這引起了

NoMethodError: undefined method `to_str' for {:a=>"argument1", :b=>"argument2"}:Hash 

是否有可能基於使用URI API哈希來構造查詢字符串?我不想猴子補丁哈希對象...

回答

8

只需撥打'#to_query'就哈希。

hash = { 
    a: 'argument1', 
    b: 'argument2' 
    #... dozen more arguments 
} 
URI::HTTPS.build(host: 'example.com', query: hash.to_query) 

=> https://example.com?a=argument1&b=argument2

如果你不使用軌道記得require 'uri'

+7

'to_query '是一個Rails唯一的方法。它在Ruby中不存在。 –

+1

@marc_ferna問題在rails標籤上有紅寶石。您可以在非rails項目中包含ActiveSupport –

1

對於那些不使用Rails或積極支持,使用Ruby標準庫中的解決方案是

hash = { 
    a: 'argument1', 
    b: 'argument2' 
} 
URI::HTTPS.build(host: 'example.com', query: URI.encode_www_form(hash)) 
=> #<URI::HTTPS https://example.com?a=argument1&b=argument2> 
相關問題