2010-03-23 13 views
111

मैं की तरहरुबी या रेल के साथ यूआरएल से यूआरएल पैरामीटर निकालने के लिए कैसे?

http://www.example.com/something?param1=value1&param2=value2&param3=value3 

, कुछ यूआरएल है और मैं इन URL से पैरामीटर निकालें और उन्हें एक हैश में प्राप्त करना चाहते हैं। जाहिर है, मैं नियमित अभिव्यक्तियों का उपयोग कर सकता था, लेकिन मैं बस सोच रहा था कि रूबी या रेल के साथ ऐसा करने के आसान तरीके हैं या नहीं। मुझे रूबी मॉड्यूल URI में कुछ भी नहीं मिला है, लेकिन शायद मुझे कुछ याद आया।

extract_parameters_from_url("http://www.example.com/something?param1=value1&param2=value2&param3=value3") 
#=> {:param1 => 'value1', :param2 => 'value2', :param3 => 'value3'} 

आप कुछ सलाह होगा:

वास्तव में, मैं एक विधि है कि क्या करना होगा कि ज़रूरत है?

+1

'हैश [* string.split ('&')। संग्रह {| i | i.split ('=')}। flatten] ' यह भी काम करेगा, लेकिन शायद यह इस मामले के लिए सबसे खराब विकल्प है।लेकिन फिर भी आपको यह स्निपेट दिलचस्प लगेगा। (टिप्पणी के रूप में पोस्ट करना क्योंकि मैं इसे एक उत्तर नहीं मानता :-)) – Vojto

उत्तर

125

मुझे लगता है कि आप किसी दिए गए यूआरएल स्ट्रिंग को एक हश में बदलना चाहते हैं?

आप http://www.ruby-doc.org/stdlib/libdoc/cgi/rdoc/classes/CGI.html#M000075

require 'cgi' 

CGI::parse('param1=value1&param2=value2&param3=value3') 

रिटर्न

{"param1"=>["value1"], "param2"=>["value2"], "param3"=>["value3"]} 
+0

ठीक है, वह मुझे याद आया था! URI.parse: CGI.parse (URI.parse ("http://www.example.com/something?param1=value1¶m2=value2¶m3=value3") .query के साथ उपयोग किए जाने पर यह सही है। वांछित हैश लौटाता है। आपकी सहायता के लिए धन्यवाद. – Flackou

+77

स्पष्टता के लिए, @Flackou यह चाहता है: 'CGI.parse (URI.parse (url) .query)' –

+0

मैंने इसका परीक्षण नहीं किया है, लेकिन पूर्ण यूआरएल युक्त पहली कुंजी सूचीबद्ध है, वास्तव में गलत लगता है। – Levi

-2

अपने कंट्रोलर में, आपको params नामक एक शब्दकोश (हैश) तक पहुंचने में सक्षम होना चाहिए। इसलिए, यदि आप जानते हैं कि प्रत्येक क्वेरी पैरामीटर के नाम क्या हैं, तो बस इसे एक्सेस करने के लिए params[:param1] करें ... यदि आपको नहीं पता कि पैरामीटर के नाम क्या हैं, तो आप शब्दकोश को पार कर सकते हैं और चाबियाँ प्राप्त कर सकते हैं।

कुछ सरल उदाहरण here

+0

ठीक है, मुझे पता था कि यह अनुरोधित यूआरएल के साथ नियंत्रक में अच्छी तरह से काम करता है, लेकिन दूसरों के मनमाने ढंग से यूआरएल के लिए ऐसा कैसे करें? – Flackou

129

कोशिश कर सकते हैं मुझे लगने हाल ही में एक परियोजना के लिए एक ही बात की जरूरत है। बिल्डिंग लेवी के समाधान के लिए, यहाँ एक क्लीनर और तेजी से विधि है:

Rack::Utils.parse_nested_query 'param1=value1&param2=value2&param3=value3' 
# => {"param1"=>"value1", "param2"=>"value2", "param3"=>"value3"} 
+0

रैक अनुरोध – Gareth

+2

अच्छा मॉकिंग करने से अधिक हल्के वजन। यदि आपके पास साधारण पैरा (गैर-नेस्टेड) ​​हैं और प्रदर्शन संवेदनशील हैं, तो रैक :: Utils.parse_query रुचि का हो सकता है। कोड पढ़ने योग्य है: https://github.com/rack/rack/blob/master/lib/rack/utils.rb – Levi

+0

यह रैम आधारित फ्रेमवर्क जैसे रामज़ पर बहुत अच्छा काम करता है! – desbest

81

बस ऊपर लेवी जवाब के साथ बेहतर -

Rack::Utils.parse_query URI("http://example.com?par=hello&par2=bye").query 

यूआरएल ऊपर इस तरह की स्ट्रिंग के लिए, यह वापस आ जाएगी

{ "par" => "hello", "par2" => "bye" } 
+7

महान उत्तर। सरल, ओप पूछताछ जैसे पूर्ण यूआरएल को संसाधित करता है, और परिणाम मान अन्य उत्तरों की तरह, सरणी के बजाय स्ट्रिंग होते हैं। धन्यवाद। – jackocnr

+1

जैसा कि मैंने उपरोक्त टिप्पणी की है, किसी के भी विपरीत की तलाश में, यह 'रैक :: Utils.build_query (पैराम्स) 'है। – zelanix

+1

सावधान रहें - कम से कम विपरीत नहीं, कम से कम रूबी 1.8.7/रेल 2.3 में नहीं। Foo [] = 1 और foo [] = 2 की एक क्वेरी स्ट्रिंग सही ढंग से {"foo" => ["1", "2"]} के रूप में पार्स की गई है, लेकिन build_query इसे "foo = 1 और foo = 2" में बदल देता है, जिसे पार्स किया जाता है फिर {"foo" => "2"} उत्पन्न करता है। – Raels

35

शुद्ध रूबी समाधान के लिए URI.parseCGI.parse के साथ गठबंधन करें (इसका उपयोग तब भी किया जा सकता है जब रेल/रैक इत्यादि की आवश्यकता न हो):

CGI.parse(URI.parse(url).query) 
# => {"name1" => ["value1"], "name2" => ["value1", "value2", ...] } 
24

आपकी समस्या को हल करने के लिए एक से अधिक तरीके हैं। अन्य ने आपको कुछ चाल दिखायी हैं। मुझे एक और चाल पता है। यहाँ मेरी कोशिश है: -

require 'uri' 
url = "http://www.example.com/something?param1=value1&param2=value2&param3=value3" 
uri = URI(url) 
# => #<URI::HTTP:0x89e4898 URL:http://www.example.com/something?param1=value1&param2=value2&param3=value3> 
URI::decode_www_form(uri.query).to_h # if you are in 2.1 or later version of Ruby 
# => {"param1"=>"value1", "param2"=>"value2", "param3"=>"value3"} 
Hash[URI::decode_www_form(uri.query)] # if you are below 2.1 version of Ruby 
# => {"param1"=>"value1", "param2"=>"value2", "param3"=>"value3"} 

पढ़ें ::decode_www_form की विधि docomentation।

10

बाहर addressable मणि चेक - कि आसान पार्सिंग क्वेरी बनाता रूबी के यूआरआई मॉड्यूल के लिए एक लोकप्रिय प्रतिस्थापन:

require "addressable/uri" 
uri = Addressable::URI.parse("http://www.example.com/something?param1=value1&param2=value2&param3=value3") 
uri.query_values['param1'] 
=> 'value1' 

(यह भी जाहिरा तौर पर परम एन्कोडिंग/डिकोडिंग संभालती है, यूआरआई के विपरीत)

+1

हम। यह एक अच्छा मणि है। मुझे यह पसंद है .. +1 –

संबंधित मुद्दे