Как настроить схему для объекта URI в Ruby

Я пытаюсь разобрать URI с пользовательского ввода. Я предполагаю, что некоторые пользователи не поместят схему в свой URI, и я хочу по умолчанию "http".

Следующий код не работает:

require 'uri'   

uri_to_check = URI::parse("www.google.com")
uri_to_check.scheme = "http" unless uri_to_check.scheme

puts uri_to_check.to_s

Я ожидаю увидеть " http://www.google.com", но я получаю "http: www.google.com". Возможно ли это сделать так?

Если да, то что мне не хватает?

Есть ли лучший способ сделать это?

Ответы

Ответ 1

Ведущие косые черты (//) указывают, что URL-адрес является IP-адресом и необходимы для обозначения имени хоста, поэтому URI может их правильно проанализировать.

В Википедии есть несколько хороших обзоров и примеров использования:

http://en.wikipedia.org/wiki/Url, http://en.wikipedia.org/wiki/URI_scheme, http://en.wikipedia.org/wiki/URL_normalization

Наилучшая информация содержится в самой спецификации: http://www.ietf.org/rfc/rfc1738.txt, в частности в разделе 3.1 "3.1. Синтаксис общей схемы Интернета".

Возможно, вы захотите рассмотреть использование Addressable gem. Это умнее, и это то, что я использую, когда мне нужно много разбора или манипулирования URI.

http://addressable.rubyforge.org/ и http://addressable.rubyforge.org/api/Addressable/URI.html

Ответ 2

Когда строка, которую вы хотите разобрать, не кодирует схему, URI не распознает ее как имя хоста:

irb(main):001:0> require 'uri'
=> true
irb(main):002:0> uri = URI::parse("www.google.com")
=> #<URI::Generic:0x11cfc88 URL:www.google.com>
irb(main):003:0> uri.path
=> "www.google.com"
irb(main):004:0> uri.host
=> nil

Когда вы устанавливаете схему так же, как в своем примере, а затем вызываете to_s, URI создается без хоста...

Вы можете попробовать что-то вроде следующего: (Это быстрый хак, я не знаю детали URI...)

uri = URI::parse("www.google.com")
if uri.scheme.nil? && uri.host.nil?
  unless uri.path.nil?
    uri.scheme = "http"
    uri.host = uri.path
    uri.path = ""
  end
end

puts uri.to_s