2010-10-02 18 views
13

में मैं एक यूआरआई ऑब्जेक्ट में योजना कैसे सेट कर सकता हूं, मैं उपयोगकर्ता इनपुट से यूआरआई को पार्स करने की कोशिश कर रहा हूं। मुझे लगता है कि कुछ उपयोगकर्ता इस योजना को अपने यूआरआई में नहीं डालेंगे और मैं "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"। क्या यह इस तरह से करना संभव है?

यदि हां, तो मुझे क्या याद आ रही है?

क्या ऐसा करने का कोई बेहतर तरीका है?

उत्तर

14

प्रमुख स्लेश (//) इंगित करता है कि यूआरएल एक आईपी-आधारित पता है, और होस्टनाम को ध्वजांकित करने के लिए आवश्यक है ताकि यूआरआई उन्हें सही तरीके से पार्स कर सके।

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

सबसे अच्छा जानकारी कल्पना में ही है:। विशेष रूप से खंड 3.1 में http://www.ietf.org/rfc/rfc1738.txt "3.1 आम इंटरनेट योजना सिंटेक्स

विकिपीडिया कुछ अच्छी अवलोकन हैं और उपयोग की उदाहरण है "।

आप पता योग्य मणि का उपयोग करने पर विचार करना चाहेंगे। यह चालाक है और जब मैं बहुत सारे यूआरआई पार्सिंग या हेरफेर करने की ज़रूरत होती हूं तो मैं इसका उपयोग करता हूं।

http://addressable.rubyforge.org/ और http://addressable.rubyforge.org/api/Addressable/URI.html

+8

+1। आपके विशेष उपयोग के मामले के लिए, आप 'पता योग्य :: URI.heuristic_parse' को देखना चाहते हैं, जो * विशेष रूप से * मामले के लिए लक्षित है, जहां जानबूझकर छोड़कर यूआरआई से कुछ जानकारी वास्तव में गायब हो जाती है। –

+0

पता योग्य :: URI.heuristic_parse वही है जो मैं ढूंढ रहा हूं। धन्यवाद! – maz

+0

सहमत .. टिन मैन क्या कहता है सच है, लेकिन असली दुनिया के मामले के मामले (या कम से कम, सवाल विशेष रूप से क्या संदर्भित करता है) के लिए, 'पता योग्य :: URI.heuristic_parse' की आवश्यकता है। – hlascelles

4

स्ट्रिंग आप चाहते हैं पार्स किया जा सकता जब एक योजना conatin नहीं करता है, 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::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,123,
+0

धन्यवाद! उदाहरण फिक्स्ड। एक छोटी प्रतिलिपि/पेस्ट समस्या;) – maz

+0

यह यूआरआई के लिए काम नहीं करेगा जिसमें पथ है। आप शायद इस योजना के साथ फिर से विश्लेषण कर सकते हैं। –