-->

How do I access Sinatra params using a symbol?

2020-08-22 07:07发布

问题:

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?

回答1:

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.



标签: sinatra