2010-03-23 16 views
111

que tienen algunas de las URL, como¿Cómo extraer los parámetros de URL de una URL con Ruby o Rails?

http://www.example.com/something?param1=value1&param2=value2&param3=value3 

y me gustaría para extraer los parámetros de estas URL y conseguir que en un hash. Obviamente, podría usar expresiones regulares, pero me preguntaba si habría formas más fáciles de hacerlo con Ruby o Rails. No he encontrado nada en el módulo Ruby URI, pero quizás me perdí algo.

De hecho, necesito un método que hacer eso:

extract_parameters_from_url("http://www.example.com/something?param1=value1&param2=value2&param3=value3") 
#=> {:param1 => 'value1', :param2 => 'value2', :param3 => 'value3'} 

¿Le tienen algunos consejos?

+1

'hash [* string.split ('&'). collect {| i | i.split ('=')}. flatten] ' Esto funcionaría también, pero probablemente sea la peor opción para este caso.Pero aún así puede encontrar este fragmento interesante. (Publicar como comentario ya que no lo considero una respuesta :-)) – Vojto

Respuesta

125

Creo que quieres convertir cualquier cadena de URL dada en un HASH?

Usted puede intentar http://www.ruby-doc.org/stdlib/libdoc/cgi/rdoc/classes/CGI.html#M000075

require 'cgi' 

CGI::parse('param1=value1&param2=value2&param3=value3') 

vuelve

{"param1"=>["value1"], "param2"=>["value2"], "param3"=>["value3"]} 
+0

OK, ¡ese fue el que me perdí! Es perfecto cuando se utiliza con URI.parse: CGI.parse (URI.parse ("http://www.example.com/something?param1=value1¶m2=value2¶m3=value3") .query) devuelve el hash deseado. Gracias por tu ayuda. – Flackou

+77

Para mayor claridad, @Flackou quiere esto: 'CGI.parse (URI.parse (url) .query)' –

+0

No he probado esto, pero la primera clave en la lista, que contiene la url completa, parece realmente incorrecta. – Levi

-2

En su Controlador, debe poder acceder a un diccionario (hash) llamado params. Entonces, si sabe cuáles son los nombres de cada parámetro de consulta, simplemente haga params[:param1] para acceder a él ... Si no sabe cuáles son los nombres de los parámetros, puede recorrer el diccionario y obtener las claves.

Algunos ejemplos simples here.

+0

OK, sabía que funciona bien en el controlador con la URL solicitada, pero ¿cómo hacer eso para otras URL arbitrarias? – Flackou

129

me encontré que necesita la misma cosa para un proyecto reciente. Sobre la base de la solución de Levi, aquí hay un método más limpio y más rápido:

Rack::Utils.parse_nested_query 'param1=value1&param2=value2&param3=value3' 
# => {"param1"=>"value1", "param2"=>"value2", "param3"=>"value3"} 
+0

Mucho más liviano que burlarse de una solicitud de rack – Gareth

+2

Buen hallazgo. Si tiene parámetros simples (no anidados) y es sensible al rendimiento, Rack :: Utils.parse_query podría ser de su interés. Vale la pena leer el código: https://github.com/rack/rack/blob/master/lib/rack/utils.rb – Levi

+0

¡Esto funciona muy bien en frameworks basados ​​en Rack como Ramaze! – desbest

81

Sólo mejorada con Levi respuesta anterior -

Rack::Utils.parse_query URI("http://example.com?par=hello&par2=bye").query 

Para una cadena como por encima de URL, volverá

{ "par" => "hello", "par2" => "bye" } 
+7

gran respuesta. simple, procesa la URL completa como las opciones de operación, y los valores resultantes son cadenas en lugar de matrices, como en las otras respuestas. Gracias. – jackocnr

+1

Como comenté anteriormente, para cualquiera que busque lo contrario, es 'Rack :: Utils.build_query (params)'. – zelanix

+1

Cuidado: no es exactamente lo contrario, al menos no en Ruby 1.8.7/Rails 2.3. Una cadena de consulta de foo [] = 1 & foo [] = 2 se analiza correctamente como {"foo" => ["1", "2"]}, pero build_query lo convierte en "foo = 1 & foo = 2", que cuando se analiza nuevamente cede {"foo" => "2"}. – Raels

35

Para una solución de Ruby pura, combine URI.parse con CGI.parse (esto puede usarse incluso si no se requieren Rails/Rack, etc.):

CGI.parse(URI.parse(url).query) 
# => {"name1" => ["value1"], "name2" => ["value1", "value2", ...] } 
24

Existen más de una manera para solucionar su problema. Otros te ha mostrado algunos trucos. Sé otro truco. Aquí está mi intento: -

require 'uri' 
url = "http://www.example.com/something?param1=value1&param2=value2&param3=value3" 
uri = URI(url) 
# => #<URI::HTTP:0x89e4898 URL:http://www.example.com/something?param1=value1&param2=value2&param3=value3> 
URI::decode_www_form(uri.query).to_h # if you are in 2.1 or later version of Ruby 
# => {"param1"=>"value1", "param2"=>"value2", "param3"=>"value3"} 
Hash[URI::decode_www_form(uri.query)] # if you are below 2.1 version of Ruby 
# => {"param1"=>"value1", "param2"=>"value2", "param3"=>"value3"} 

Leer el método de docomentation ::decode_www_form.

10

Mira la addressable joya - un reemplazo popular para módulo de URI de Ruby que hace la consulta de análisis fácil:

require "addressable/uri" 
uri = Addressable::URI.parse("http://www.example.com/something?param1=value1&param2=value2&param3=value3") 
uri.query_values['param1'] 
=> 'value1' 

(También parecer maneja parámetro de codificación/decodificación, a diferencia URI)

+1

Humm. Esta es una buena gema. Me gusta ... +1 –

Cuestiones relacionadas