ruby on rails - ¿Cómo extraer los parámetros de URL de una URL con Ruby o Rails?
ruby-on-rails uri (7)
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¶m2=value2¶m3=value3'')
devoluciones
{"param1"=>["value1"], "param2"=>["value2"], "param3"=>["value3"]}
Tengo algunas URL, como
http://www.example.com/something?param1=value1¶m2=value2¶m3=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¶m2=value2¶m3=value3")
#=> {:param1 => ''value1'', :param2 => ''value2'', :param3 => ''value3''}
¿Tendría algunos consejos?
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 here .
Hay más de una manera, para resolver 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¶m2=value2¶m3=value3"
uri = URI(url)
# => #<URI::HTTP:0x89e4898 URL:http://www.example.com/something?param1=value1¶m2=value2¶m3=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"}
Lee el método de docomentation de ::decode_www_form
.
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" }
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¶m2=value2¶m3=value3''
# => {"param1"=>"value1", "param2"=>"value2", "param3"=>"value3"}
Mira la gema addressable , 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¶m2=value2¶m3=value3")
uri.query_values[''param1'']
=> ''value1''
(También aparentemente maneja la codificación / decodificación param, a diferencia del URI)
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", ...] }