2010-10-02 9 views
13

'daki bir URI nesnesine nasıl kurabilirim Kullanıcı girişinden bir URI'yi ayrıştırmaya çalışıyorum. Bazı kullanıcıların şemayı URI'larına yerleştirmeyeceğini ve varsayılan olarak "http" a ayarlamayı istediğimi varsayıyorum.Ruby'yi

Aşağıdaki kod çalışmaz:

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 

ben "http://www.google.com" görmeyi bekliyoruz ama "http: www.google.com" olsun. Bu şekilde yapmak bile mümkün mü?

Eğer öyleyse, neyi özlüyorum?

Bunu yapmanın daha iyi bir yolu var mı? İstediğiniz dize bir plan conatin gelmez ayrıştırılmasına zaman

cevap

14

Önde gelen eğik çizgiler (//) URL'nin IP tabanlı bir adres olduğunu ve URI'nin bunları doğru bir şekilde ayrıştırması için ana makine adını işaretlemek için gerekli olduğunu belirtir.

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

iyi bilgi spec kendisinde olduğundan:. Özellikle bölüm 3.1 http://www.ietf.org/rfc/rfc1738.txt "3.1 Ortak İnternet Şeması dizimi

Vikipedi bazı iyi genel bilgileri ve kullanım örnekler vardır ".

Adreslenebilir gem'i kullanmayı düşünebilirsiniz. Daha akıllı ve çok fazla URI ayrıştırma veya manipülasyon yapmam gerektiğinde kullanıyorum.

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

+8

+1. Sizin özel kullanım durumunuz için, kasıtlı olarak dışarıda bırakılmak yerine, URI'den bazı bilgilerin gerçekten eksik olduğu, özellikle * için * amaçlanan 'Addressable :: URI.heuristic_parse' adresine bakmak isteyebilirsiniz. –

+0

Adreslenebilir :: URI.heuristic_parse tam da aradığım şey. Teşekkür ederim! – maz

+0

Anlaşıldı .. Teneke Adam'ın söylediği doğrudur, ancak gerçek dünya kullanım durumu için (ya da en azından, özel olarak ne anlama geliyorsa), 'Adreslenebilir :: URI.heuristic_parse' gerekli olan şeydir. – hlascelles

4

, URI bir konak ismi olarak o tanımıyor:

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 

Eğer örnekte ardından yaptığımız gibi düzeni ayarlandığında ... URI ev sahibi olmadan inşa olduğunu to_s çağrı

aşağıdaki gibi bir şey deneyebilirsiniz: (O ... Ben URI ayrıntıları bilmiyorum, hızlı kesmek var)

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 
+0

teşekkürler! Örnek düzeltildi. Küçük bir kopyalama/yapıştırma sorunu;) – maz

+0

Bu, yolu olan URI'lar için çalışmaz. Muhtemelen şema ile yeniden ayrışabilirsiniz. –