Как настроить схему для объекта 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