Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I access Sinatra params using a symbol?

Tags:

sinatra

In Sinatra, I use params to get the key/value passed through the URL query string. I noticed I can use either a string or a symbol as the key to get the value. So if the URL is:

http://localhost:4567/x?a=1&b=2

Then:

params[:a] # => "1"
params["a"] # => "1"
params.to_s # => '{"name"=>"x", "a"=>"1", "b"=>"2"}'
params.class # => Hash

I can tell params is a Hash. But this doesn't seem to be a common behavior of a Hash.

h = {"a" => "1", "b" => "2"}
h["a"] # => "1"
h[:a] # => nil

Can someone please explain how this is achieved through Sinatra?

like image 712
Xiao Avatar asked Dec 23 '11 18:12

Xiao


1 Answers

Always a good idea to have a read of the source. Specifically, the indifferent_params method.

# Enable string or symbol key access to the nested params hash.
def indifferent_params(params)
  params = indifferent_hash.merge(params)
  params.each do |key, value|
    next unless value.is_a?(Hash)
    params[key] = indifferent_params(value)
  end
end

As the comment states, it's this method (invoked on line 704 of the same file) that allows string and symbol access to the params hash.

like image 136
Alex Avatar answered Sep 26 '22 01:09

Alex