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?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With