Как я могу получить доступ к параметрам Синатры, используя символ? - PullRequest
8 голосов
/ 23 декабря 2011

В Sinatra я использую params для получения ключа / значения, переданного через строку запроса URL. Я заметил, что могу использовать строку или символ в качестве ключа для получения значения. Так что, если URL-адрес:

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

Тогда:

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

Я могу сказать, что params - это Hash. Но это не похоже на обычное поведение хэша.

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

Может кто-нибудь объяснить, как это достигается с помощью Синатры?

1 Ответ

18 голосов
/ 23 декабря 2011

Всегда хорошая идея прочитать источник . В частности, метод indifferent_params .

# 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

Как отмечается в комментарии, именно этот метод (вызывается в строке 704 того же файла) позволяет строке и символу получать доступ к хэшу params.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...