2011-12-23 23 views
7

En Sinatra, uso params para obtener la clave/valor pasado a través de la cadena de consulta URL. Noté que puedo usar una cadena o un símbolo como la clave para obtener el valor. Así que si la URL es:¿Cómo accedo a parametros de Sinatra usando un símbolo?

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

continuación:

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

que puedo decir params es un hash. Pero esto no parece ser un comportamiento común de un Hash.

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

¿Puede alguien explicar cómo se consigue esto a través de Sinatra?

Respuesta

16

Siempre es una buena idea tener una lectura del source. Específicamente, el 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 

Como dice el comentario, es este método (invocado en line 704 del mismo archivo) que permite cuerda y símbolo de acceso a la params hash.

+1

No sé si esto es posible con ruby, pero si pudieran anular el método de acceso hash ('[]'), ¿no sería mejor permitir que este método convierta símbolos a cadenas en lugar de duplicar cada ¿par? Parece una opción de diseño relativamente caro por los beneficios que brinda. – MarioDS

+0

La [implementación actual] (https://github.com/sinatra/sinatra/blob/6ce8a94005397695f0fd2cc241cd09fb325dd567/lib/sinatra/base.rb#L1060-L1062) es mucho más ligera: 'Hash.new {| hash, key | hash [key.to_s] if Symbol === key} ', lo que significa que si la clave es un Symbol, intente con la versión String de la clave. –

Cuestiones relacionadas