如何使用Ruby中的哈希查询参数构造URI

时间:2015-10-21 10:45:48

标签: ruby-on-rails ruby hash uri ruby-2.2

如何通过传递哈希来构造带有查询参数的URI对象?

我可以使用:

生成查询

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

生成

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

但是我认为为许多参数构造查询字符串将是不可读的并且难以维护。我想通过传递hash来构造查询字符串。如下例所示:

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构建基于哈希的查询字符串?我不想要修补哈希对象......

2 个答案:

答案 0 :(得分:9)

只需在哈希上调用'#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

如果您不使用rails,请记得require 'uri'

答案 1 :(得分:9)

对于那些不使用Rails或Active Support的用户,使用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>