У меня есть несколько URL-адресов, например
http://www.example.com/something?param1=value1¶m2=value2¶m3=value3
и я хотел бы извлечь параметры из этих URL-адресов и получить их в виде хэша. Очевидно, я мог бы использовать регулярные выражения, но мне просто было интересно, есть ли более простые способы сделать это с помощью 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'}
Не могли бы вы дать совет?
ruby-on-rails
ruby
uri
url-parameters
Flackou
источник
источник
Hash[*string.split('&').collect{|i|i.split('=')}.flatten]
Это тоже сработает, но, вероятно, это худший вариант в данном случае. Но все же этот фрагмент может показаться вам интересным. (Публикуется как комментарий, поскольку я не считаю это ответом :-))Ответы:
Я думаю, вы хотите превратить любую заданную строку 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"]}
источник
CGI.parse(URI.parse(url).query)
CGI::parse(URI::parse(url).query)
Я обнаружил, что мне нужно то же самое для недавнего проекта. Основываясь на решении Леви, вот более чистый и быстрый метод:
Rack::Utils.parse_nested_query 'param1=value1¶m2=value2¶m3=value3' # => {"param1"=>"value1", "param2"=>"value2", "param3"=>"value3"}
источник
param1=value1¶m1=value2
. Второе значение превосходит первое.Rack::Utils.build_nested_query(params)
(илиRack::Utils.build_query(params)
если его проанализироватьRack::Utils.parse_query
).Просто улучшено с ответом Леви выше -
Rack::Utils.parse_query URI("http://example.com?par=hello&par2=bye").query
Для строки, подобной URL-адресу выше, он вернет
{ "par" => "hello", "par2" => "bye" }
источник
Rack::Utils.build_query(params)
.Для чистого решения Ruby объедините
URI.parse
сCGI.parse
(это можно использовать, даже если Rails / Rack и т. Д. Не требуются):CGI.parse(URI.parse(url).query) # => {"name1" => ["value1"], "name2" => ["value1", "value2", ...] }
источник
Есть несколько способов решить вашу проблему. Другие показали вам некоторые уловки. Я знаю еще одну уловку. Вот моя попытка: -
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"}
Прочтите документацию по методу
::decode_www_form
.источник
Обратите внимание на адресуемую жемчужину - популярную замену модуля URI Ruby, которая упрощает синтаксический анализ запросов:
require "addressable/uri" uri = Addressable::URI.parse("http://www.example.com/something?param1=value1¶m2=value2¶m3=value3") uri.query_values['param1'] => 'value1'
(Он также, по-видимому, обрабатывает кодирование / декодирование параметров, в отличие от URI)
источник
В вашем контроллере вы должны иметь доступ к словарю (хешу) с именем
params
. Итак, если вы знаете, как называются имена каждого параметра запроса, просто сделайте,params[:param1]
чтобы получить к нему доступ ... Если вы не знаете, каковы имена параметров, вы можете пройти по словарю и получить ключи.Некоторые простые примеры здесь .
источник