2011-12-23 13 views
7

Sinatra'da, URL sorgu dizesinden geçirilen anahtar/değer almak için params kullanıyorum. Değeri elde etmek için anahtar olarak bir dize veya sembolü kullanabilirim. Yani URL ise: SonraSinatra paramlarına bir sembol kullanarak nasıl erişirim?

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 

Ben params söyleyebilir bir Hash olduğunu. Ancak bu, bir Hash'ın ortak bir davranışı gibi görünmemektedir.

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

Birisi bunun Sinatra üzerinden nasıl gerçekleştirildiğini açıklayabilir mi?

cevap

16

source'un her zaman okunması için iyi bir fikir. Spesifik olarak, indifferent_params method. Yorum devletler olarak

# 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 

, bu params karma dize ve sembol erişimi sağlayan bu yöntem (aynı dosyanın line 704 üzerine çağrılan) bulunuyor.

+1

Bunun rubi ile mümkün olup olmadığını bilmiyorum, ancak karma erişim yöntemini ('[]') geçersiz kılabilirlerse, bu yöntemin her yerine çoğaltmak yerine sembolleri dizelere dönüştürmesine izin vermek daha iyi olmaz mı? çift? Ne yararları için nispeten pahalı bir tasarım seçimi gibi görünüyor. – MarioDS

+0

[Geçerli uygulama] (https://github.com/sinatra/sinatra/blob/6ce8a94005397695f0fd2cc241cd09fb325dd567/lib/sinatra/base.rb#L1060-L1062) çok daha açık: 'Hash.new {| karma, anahtar | hash [key.to_s], eğer Symbol === key} 'ise, anahtar bir Symbol ise, anahtarın String versiyonunu deneyin. –

İlgili konular