2011-12-23 2 views
7

Sinatra에서 매개 변수를 사용하여 URL 쿼리 문자열을 통해 전달 된 키/값을 가져 왔습니다. 값을 얻기 위해 문자열이나 기호를 키로 사용할 수 있다는 것을 알았습니다. 그래서 URL 인 경우 : 다음기호를 사용하여 Sinatra 매개 변수에 액세스하려면 어떻게해야합니까?

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 말할 수는 해시이다. 그러나 이것은 해시의 일반적인 행동으로 보이지 않습니다.

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

누군가가 시나트라를 통해 어떻게 달성되는지 설명해주십시오.

답변

16

항상 source을 읽는 것이 좋습니다. 특히 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 

, 그것은 params 해시 문자열 및 기호 액세스 할 수 있습니다이 방법 (같은 파일의 line 704에서 호출)입니다.

+1

루비에서는 이것이 가능한지 모르겠지만 해쉬 액세스 방법 ('[]')을 오버라이드 할 수 있다면이 메소드가 모든 것을 복제하는 것이 아니라 심볼을 문자열로 변환하는 것을 허용하는 것이 좋지 않을까요? 쌍? 그것이주는 이점에 대해 상대적으로 비싼 디자인 선택처럼 보입니다. – MarioDS

+0

[현재 구현] (https://github.com/sinatra/sinatra/blob/6ce8a94005397695f0fd2cc241cd09fb325dd567/lib/sinatra/base.rb#L1060-L1062)은 훨씬 가벼워졌습니다 :'Hash.new {| hash, key | 해시 [key.to_s] 만약 심볼 === 키}', 즉 키가 심볼이면, 문자열 버전의 키로 시도하십시오. –

관련 문제