Ruby: How to turn a hash into HTTP parameters? Ruby: How to turn a hash into HTTP parameters? ruby ruby

Ruby: How to turn a hash into HTTP parameters?


For basic, non-nested hashes, Rails/ActiveSupport has Object#to_query.

>> {:a => "a", :b => ["c", "d", "e"]}.to_query=> "a=a&b%5B%5D=c&b%5B%5D=d&b%5B%5D=e">> CGI.unescape({:a => "a", :b => ["c", "d", "e"]}.to_query)=> "a=a&b[]=c&b[]=d&b[]=e"

http://api.rubyonrails.org/classes/Object.html#method-i-to_query


If you are using Ruby 1.9.2 or later, you can use URI.encode_www_form if you don't need arrays.

E.g. (from the Ruby docs in 1.9.3):

URI.encode_www_form([["q", "ruby"], ["lang", "en"]])#=> "q=ruby&lang=en"URI.encode_www_form("q" => "ruby", "lang" => "en")#=> "q=ruby&lang=en"URI.encode_www_form("q" => ["ruby", "perl"], "lang" => "en")#=> "q=ruby&q=perl&lang=en"URI.encode_www_form([["q", "ruby"], ["q", "perl"], ["lang", "en"]])#=> "q=ruby&q=perl&lang=en"

You'll notice that array values are not set with key names containing [] like we've all become used to in query strings. The spec that encode_www_form uses is in accordance with the HTML5 definition of application/x-www-form-urlencoded data.


Update: This functionality was removed from the gem.

Julien, your self-answer is a good one, and I've shameless borrowed from it, but it doesn't properly escape reserved characters, and there are a few other edge cases where it breaks down.

require "addressable/uri"uri = Addressable::URI.newuri.query_values = {:a => "a", :b => ["c", "d", "e"]}uri.query# => "a=a&b[0]=c&b[1]=d&b[2]=e"uri.query_values = {:a => "a", :b => [{:c => "c", :d => "d"}, {:e => "e", :f => "f"}]}uri.query# => "a=a&b[0][c]=c&b[0][d]=d&b[1][e]=e&b[1][f]=f"uri.query_values = {:a => "a", :b => {:c => "c", :d => "d"}}uri.query# => "a=a&b[c]=c&b[d]=d"uri.query_values = {:a => "a", :b => {:c => "c", :d => true}}uri.query# => "a=a&b[c]=c&b[d]"uri.query_values = {:a => "a", :b => {:c => "c", :d => true}, :e => []}uri.query# => "a=a&b[c]=c&b[d]"

The gem is 'addressable'

gem install addressable