convert ruby hash to URL query string ... without those square brackets

19,959

Solution 1

In modern ruby this is simply:

require 'uri'
URI.encode_www_form(hash)

Solution 2

Quick Hash to a URL Query Trick :

"http://www.example.com?" + { language: "ruby", status: "awesome" }.to_query

# => "http://www.example.com?language=ruby&status=awesome"

Want to do it in reverse? Use CGI.parse:

require 'cgi' 
# Only needed for IRB, Rails already has this loaded

CGI::parse "language=ruby&status=awesome"

# => {"language"=>["ruby"], "status"=>["awesome"]} 

Solution 3

Here's a quick function to turn your hash into query parameters:

require 'uri'
def hash_to_query(hash)
  return URI.encode(hash.map{|k,v| "#{k}=#{v}"}.join("&"))
end
Share:
19,959
Charlie
Author by

Charlie

Updated on June 17, 2022

Comments

  • Charlie
    Charlie about 2 years

    In Python, I can do this:

    >>> import urlparse, urllib
    >>> q = urlparse.parse_qsl("a=b&a=c&d=e")
    >>> urllib.urlencode(q)
    'a=b&a=c&d=e'
    

    In Ruby[+Rails] I can't figure out how to do the same thing without "rolling my own," which seems odd. The Rails way doesn't work for me -- it adds square brackets to the names of the query parameters, which the server on the other end may or may not support:

    >> q = CGI.parse("a=b&a=c&d=e")
    => {"a"=>["b", "c"], "d"=>["e"]}
    >> q.to_params
    => "a[]=b&a[]=c&d[]=e"
    

    My use case is simply that I wish to muck with the values of some of the values in the query-string portion of the URL. It seemed natural to lean on the standard library and/or Rails, and write something like this:

    uri = URI.parse("http://example.com/foo?a=b&a=c&d=e")
    q = CGI.parse(uri.query)
    q.delete("d")
    q["a"] << "d"
    uri.query = q.to_params # should be to_param or to_query instead?
    puts Net::HTTP.get_response(uri)
    

    but only if the resulting URI is in fact http://example.com/foo?a=b&a=c&a=d, and not http://example.com/foo?a[]=b&a[]=c&a[]=d. Is there a correct or better way to do this?

  • mrudult
    mrudult over 8 years
    This sorts the keys in alphabetical order
  • Aaron Jensen
    Aaron Jensen over 8 years
    This does not properly escape keys or values.
  • Jordan Stewart
    Jordan Stewart over 7 years
    Here is the documentation for stdlib-2.1.0: ruby-doc.org/stdlib-2.1.0/libdoc/uri/rdoc/…
  • aidan
    aidan almost 6 years
    Don't use this. It will fail if any key or value contains = or &
  • gorn
    gorn over 5 years
    to_query is standard method or ruby Hash?
  • Ulysse BN
    Ulysse BN over 4 years
    @gorn no, it is rails specific, see Hash#to_query
  • equivalent8
    equivalent8 over 3 years
    I'm doing 11 years RoR never heard of {}.to_query Wow ! that's briliant !