¿Cómo extraer los parámetros de URL de una URL con Ruby o Rails?

Tengo algunas URL, como

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

y me gustaría extraer los parámetros de estas URL y obtenerlos en una 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 URI módulo Ruby, pero quizás me haya perdido algo.

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

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

¿Tendría algunos consejos?

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

    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') 

    devoluciones

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

    Me encontré necesitando lo mismo 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"} 

    Just Improved con la respuesta de Levi anterior –

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

    Para una cadena como la URL anterior, devolverá

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

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

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

    Hay más de una manera, para resolver su problema. Otros te ha mostrado algunos trucos. Sé otro truco. Aquí está mi bash: –

     require 'uri' url = "http://www.example.com/something?param1=value1&param2=value2&param3=value3" uri = URI(url) # => # 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"} 

    Lee el método de docomentation de ::decode_www_form .

    Mira la gem direccionable , un reemplazo popular para el módulo URI de Ruby que facilita el análisis de consultas:

     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 aparentemente maneja la encoding / deencoding param, a diferencia del URI)

    En su Controlador, debería 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 el llaves.

    Algunos ejemplos simples aquí .