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¶m2=two¶m2=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
...¶m2[]=two¶m2[]=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¶m2=two¶m2=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