Как извлечь параметры URL из URL-адреса с помощью Ruby или Rails?

у меня есть некоторые URL-адреса, например

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

и я хотел бы извлечь параметры из этих URL-адресов и получить их в хэше. Очевидно, я мог использовать регулярные выражения, но мне просто было интересно, есть ли более простые способы сделать это с Ruby или Rails. Я ничего не нашел в модуле Ruby URI но, возможно, я что-то пропустил.

на самом деле, мне нужен метод, который будет делать это:

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

не могли бы вы дать несколько советов?

7 ответов


Я думаю, вы хотите превратить любую заданную строку URL в хэш?

вы можете попробовать http://www.ruby-doc.org/stdlib/libdoc/cgi/rdoc/classes/CGI.html#M000075

require 'cgi'

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

возвращает

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

Мне нужно то же самое для последнего проекта. Основываясь на решении Леви, вот более чистый и быстрый метод:

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

просто улучшилось с ответом Levi выше -

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

для строки, как выше url, он будет возвращать

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

для чистого рубинового решения combine URI.parse С CGI.parse (Это можно использовать даже если рельсы / шкаф etc. не требуется):

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

там больше чем один путь, разрешить вашу проблему. Другие показали вам некоторые трюки. Я знаю еще один трюк. Вот моя попытка : -

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"}

прочитайте метод docomentation ::decode_www_form.


Проверьте адресуемых gem-популярная замена модуля URI Ruby, которая упрощает разбор запросов:

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

(Он также, по-видимому, обрабатывает кодирование/декодирование param, в отличие от URI)


в вашем контроллере вы должны иметь доступ к словарю (хэшу) под названием params. Итак, если вы знаете, что такое имена каждого параметра запроса, просто сделайте params[:param1] для доступа к нему... Если вы не знаете, каковы имена параметров, вы можете пройти словарь и получить ключи.

некоторые простые примеры здесь.