Как я могу установить схему для объекта URI в Ruby - PullRequest
15 голосов
/ 02 октября 2010

Я пытаюсь проанализировать 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 ". Можно ли вообще так сделать?

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

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

Ответы [ 2 ]

15 голосов
/ 02 октября 2010

Начальная косая черта (//) указывает, что 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. Общий синтаксис схемы Интернета».

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

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

5 голосов
/ 02 октября 2010

Когда строка, которую вы хотите проанализировать, не содержит схему, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...