tutorial rails español ruby sinatra

ruby - rails - Cómo obtener TODOS los parámetros de URL en una aplicación Sinatra



sinatra ruby tutorial (4)

Usando la siguiente aplicación de Sinatra

get ''/app'' do content_type :json {"params" => params}.to_json end

Invocando

/app?param1=one&param2=two&param2=alt

Da el siguiente resultado:

{"params":{"param1":"one","param2":"alt"}}

Params tiene solo dos teclas, param1 y param2.

Entiendo que Sinatra está configurando params como un hash, pero no representa toda la solicitud de URL.

¿Hay una manera en Sinatra de obtener una lista de todos los parámetros de URL enviados en la solicitud?


Creo que, por defecto, los parámetros del mismo nombre serán sobrescritos por el parámetro que se procesó en último lugar.

Usted podría configurar params2 como una serie de ordenaciones

...&param2[]=two&param2[]=alt

O analice la cadena de consulta frente al hash params proporcionado por Sinatra.


Cualquier solicitud en rack

get ''/app'' do params = request.env[''rack.request.query_hash''] end


Kwon sugiere analizar la cadena de consulta. Puedes usar CGI para analizarlo de la siguiente manera:

require ''cgi'' get ''/app'' do content_type :json {"params" => CGI::parse(request.query_string)}.to_json end

Invocando

/app?param1=one&param2=two&param2=alt

Da el siguiente resultado:

{"params":{"param1":["one"],"param2":["two","alt"]}}


Puedes crear un ayudante para que el proceso sea más amigable:

require ''cgi'' helpers do def request_params_repeats params = {} request.env["rack.input"].read.split(''&'').each do |pair| kv = pair.split(''='').map{|v| CGI.unescape(v)} params.merge!({kv[0]=> kv.length > 1 ? kv[1] : nil }) {|key, o, n| o.is_a?(Array) ? o << n : [o,n]} end params end end

A continuación, puede acceder a los parámetros en su bloque de obtención:

get ''/app'' do content_type :json request_params_repeats.to_json end