Как извлечь параметры URL из URL с помощью Ruby или Rails? - PullRequest
132 голосов
/ 23 марта 2010

У меня есть несколько 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 ]

149 голосов
/ 23 марта 2010

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

Вы можете попробовать 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"]}
144 голосов
/ 10 июля 2010

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

Rack::Utils.parse_nested_query 'param1=value1&param2=value2&param3=value3'
# => {"param1"=>"value1", "param2"=>"value2", "param3"=>"value3"}
91 голосов
/ 22 февраля 2012

Совершенствуется с ответом Леви выше -

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

Для строки, подобной указанной выше, URL вернет

{ "par" => "hello", "par2" => "bye" } 
41 голосов
/ 07 июня 2012

Для чистого решения Ruby объедините URI.parse с CGI.parse (это можно использовать, даже если Rails / Rack и т. Д. Не требуются):

CGI.parse(URI.parse(url).query) 
# =>  {"name1" => ["value1"], "name2" => ["value1", "value2", ...] }
31 голосов
/ 01 сентября 2014

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

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

Прочтите метод документации ::decode_www_form.

12 голосов
/ 02 января 2015

Ознакомьтесь с адресом , адресуемым , - популярной заменой 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'

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

0 голосов
/ 23 марта 2010

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

Несколько простых примеров здесь .

...