2011-12-23 11 views
7

In Sinatra, utilizzo i parametri per far passare la chiave/il valore attraverso la stringa di query dell'URL. Ho notato che posso usare una stringa o un simbolo come chiave per ottenere il valore. Quindi, se l'URL è:Come accedere ai parametri di Sinatra usando un simbolo?

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

Poi:

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

posso dire params è un hash. Ma questo non sembra essere un comportamento comune di un hash.

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

Qualcuno può spiegare come questo si ottiene attraverso Sinatra?

risposta

16

Sempre una buona idea avere una lettura di source. Nello specifico, lo 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 

come commento di stati, è questo metodo (invocato sulla line 704 dello stesso file) che permette di stringa e simbolo accesso al params hash.

+1

Non so se questo è possibile con Ruby, ma se potessero scavalcare il metodo di accesso ad hash ('[]'), non sarebbe meglio consentire a questo metodo di convertire i simboli in stringhe piuttosto che duplicare ogni paio? Sembra una scelta di design relativamente costosa per i benefici che offre. – MarioDS

+0

La [implementazione attuale] (https://github.com/sinatra/sinatra/blob/6ce8a94005397695f0fd2cc241cd09fb325dd567/lib/sinatra/base.rb#L1060-L1062) è molto più leggera: 'Hash.new {| hash, key | hash [key.to_s] se Symbol === key} ', ovvero se la chiave è un simbolo, prova con la versione String della chiave. –

Problemi correlati