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

Fil*_*uzi 10 ruby hash uri ruby-on-rails 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)
Run Code Online (Sandbox Code Playgroud)

提升了

NoMethodError: undefined method `to_str' for {:a=>"argument1", :b=>"argument2"}:Hash
Run Code Online (Sandbox Code Playgroud)

是否可以使用URI api构建基于哈希的查询字符串?我不想猴子补丁哈希对象...

Fil*_*uzi 13

只需要打'#to_query'哈希.

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

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

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

  • `to_query`是一种仅限Rails的方法.它在Ruby中不存在. (11认同)

Gri*_*izz 13

对于那些不使用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>
Run Code Online (Sandbox Code Playgroud)