How to construct URI with query arguments from hash in Ruby
Asked Answered
F

3

18

How to construct URI object with query arguments by passing hash?

I can generate query with:

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

which generates

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

however I think constructing query string for many arguments would be unreadable and hard to maintain. I would like to construct query string by passing hash. Like in example below:

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

which raises

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

Is it possible to construct query string based on hash using URI api? I don't want to monkey patch hash object...

Farcy answered 21/10, 2015 at 10:45 Comment(0)
F
27

If you have ActiveSupport, just call '#to_query' on hash.

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

If you are not using rails remember to require 'uri'

Farcy answered 21/10, 2015 at 10:51 Comment(2)
to_query is a Rails only method. It does not exist in Ruby.Knitting
@Knitting questions has ruby on rails tag. You can include : ActiveSupport in non-rails projectsFarcy
E
25

For those not using Rails or Active Support, the solution using the Ruby standard library is

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>
Emie answered 19/4, 2017 at 21:46 Comment(0)
E
0

You can try my iri gem, which is exactly the builder of URI/URL:

require 'iri'
uri = Iri.new
  .host('example.com')
  .add(a: 'argument1')
  .add(b: 'argument2')
  .to_s
Eisegesis answered 13/6 at 11:7 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.