Как извлечь параметры URL из URL с Ruby или Rails?
У меня есть несколько URL-адресов, например
http://www.example.com/something?param1=value1¶m2=value2¶m3=value3
и я хотел бы извлечь параметры из этих URL-адресов и получить их в Hash. Очевидно, я мог бы использовать регулярные выражения, но мне было просто интересно, есть ли более простые способы сделать это с Ruby или Rails. Я ничего не нашел в модуле Ruby URI
, но, возможно, я что-то пропустил.
На самом деле мне нужен метод, который бы сделал это:
extract_parameters_from_url("http://www.example.com/something?param1=value1¶m2=value2¶m3=value3")
#=> {:param1 => 'value1', :param2 => 'value2', :param3 => 'value3'}
У вас есть советы?
Ответы
Ответ 1
Я думаю, вы хотите превратить любую указанную строку URL в HASH?
Вы можете попробовать http://www.ruby-doc.org/stdlib/libdoc/cgi/rdoc/classes/CGI.html#M000075
require 'cgi'
CGI::parse('param1=value1¶m2=value2¶m3=value3')
возвращает
{"param1"=>["value1"], "param2"=>["value2"], "param3"=>["value3"]}
Ответ 2
Мне показалось, что мне нужно то же самое для недавнего проекта.
Основываясь на решении Levi, здесь более чистый и быстрый метод:
Rack::Utils.parse_nested_query 'param1=value1¶m2=value2¶m3=value3'
# => {"param1"=>"value1", "param2"=>"value2", "param3"=>"value3"}
Ответ 3
Просто улучшено с ответом Леви выше -
Rack::Utils.parse_query URI("http://example.com?par=hello&par2=bye").query
Для строки, такой как указанный выше URL, он вернет
{ "par" => "hello", "par2" => "bye" }
Ответ 4
Для чистого решения Ruby объедините URI.parse
с CGI.parse
(это можно использовать, даже если Rails/Rack и т.д. не требуются):
CGI.parse(URI.parse(url).query)
# => {"name1" => ["value1"], "name2" => ["value1", "value2", ...] }
Ответ 5
Есть несколько способов решить вашу проблему. Другие показали вам некоторые трюки. Я знаю еще один трюк. Вот моя попытка: -
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"}
Прочитайте метод docomentation ::decode_www_form
.
Ответ 6
Посмотрите addressable gem - популярная замена модуля Ruby URI, который упрощает анализ запросов:
require "addressable/uri"
uri = Addressable::URI.parse("http://www.example.com/something?param1=value1¶m2=value2¶m3=value3")
uri.query_values['param1']
=> 'value1'
(Он также, по-видимому, обрабатывает кодирование/декодирование параметров, в отличие от URI)
Ответ 7
В вашем контроллере вы сможете получить доступ к словарю (хэшу) под названием params
. Итак, если вы знаете, каковы имена каждого параметра запроса, просто сделайте params[:param1]
для доступа к нему... Если вы не знаете, что такое имена параметров, вы можете пересечь словарь и получить ключи.
Несколько простых примеров здесь.