Когда мне нужно разобрать URL-адреса, я использую либо встроенный в Ruby модуль URI , либо Addressable gem.
Используя URI, вам необходимодобавьте протокол, чтобы получить правильное поведение:
URI.parse('http://' + 'localhost:3000/apage.cgi?key=value').query # => "key=value"
Вы можете создать хэш значений с немного большим массажем:
Hash[URI.parse('http://localhost:3000/apage.cgi?key=value').query.split('&').map{ |q| q.split('=') }]
{
"key" => "value"
}
Hash[URI.parse('http://localhost:3000/apage.cgi?key=value&foo=bar').query.split('&').map{ |q| q.split('=') }]
{
"key" => "value",
"foo" => "bar"
}
Аналогично, используя Addressable:
require "addressable/uri" # => true
uri = Addressable::URI.parse('http://' + 'localhost:3000/apage.cgi?key=value')
#<Addressable::URI:0x100c80978
@uri_string = nil,
@validation_deferred = false,
attr_accessor :authority = nil,
attr_accessor :host = "localhost",
attr_accessor :path = "/apage.cgi",
attr_accessor :port = 3000,
attr_accessor :query = "key=value",
attr_accessor :scheme = "http",
attr_reader :hash = nil,
attr_reader :normalized_host = nil,
attr_reader :normalized_path = nil,
attr_reader :normalized_port = nil,
attr_reader :normalized_query = nil,
attr_reader :normalized_scheme = nil
>
uri.query # => "key=value"
uri.query_values # => {"key" => "value"}