16

如何通过传递哈希来构造带有查询参数的 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 基于哈希构造查询字符串?我不想修补哈希对象...

4

2 回答 2

23

对于那些不使用 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>
于 2017-04-19T21:46:30.463 回答
21

如果您有 ActiveSupport,只需调用'#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'

于 2015-10-21T10:51:30.200 回答