Ruby या Rails वाले URL से URL पैरामीटर कैसे निकालें?


137

मेरे पास कुछ URL हैं, जैसे

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

जवाबों:


162

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

आप 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"]}

1
ठीक है, वह एक मुझे याद किया गया था! URI.parse के साथ उपयोग किए जाने पर यह सही है: CGI.parse (URI.parse (" example.com/… ) वांछित हैश लौटाता है। आपकी मदद के लिए धन्यवाद।
Flackou

91
स्पष्टता के लिए, @ फाल्को यह चाहते हैं: CGI.parse(URI.parse(url).query)
ग्लेन जैकमैन

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

2
मुझे वास्तव में इसका इस्तेमाल करना था: CGI::parse(URI::parse(url).query)
portforwardpodcast

151

मैं अपने आप को हाल ही में एक परियोजना के लिए एक ही चीज की जरूरत है। लेवी के घोल का निर्माण, यहाँ एक क्लीनर और तेज़ तरीका है:

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

रैक अनुरोध का मजाक उड़ाने की तुलना में बहुत अधिक हल्का
गैरेथ

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

धन्यवाद, यह बहुत उपयोगी है :)
ब्लू स्मिथ

यह अच्छी तरह से काम करता है लेकिन एक ही नाम के साथ चेकबॉक्स के लिए काम नहीं करता है param1=value1&param1=value2:। दूसरा मान पहले ट्रम्प करता है।
B सात

व्युत्क्रम की तलाश में किसी के लिए, यह Rack::Utils.build_nested_query(params)(या Rack::Utils.build_query(params)यदि साथ पार्स किया गया है Rack::Utils.parse_query)।
zelanix

99

ऊपर दिए गए लेवी उत्तर के साथ बस बेहतर -

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

Url जैसी स्ट्रिंग के लिए, यह वापस आ जाएगी

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

7
बहुत बढ़िया जवाब। सरल, पूर्ण URL को ऑप्स की तरह प्रोसेस करता है, और परिणाम मान सरणियों के बजाय तार होते हैं, अन्य उत्तरों की तरह। धन्यवाद।
jackocnr

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

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

44

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

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

33

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

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


13

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

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

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


-3

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

यहाँ कुछ सरल उदाहरण हैं


ठीक है, मुझे पता था कि, यह अनुरोधित URL के साथ नियंत्रक में अच्छी तरह से काम करता है, लेकिन दूसरों के मनमाने यूआरएल के लिए ऐसा कैसे करें?
फ्लॅकौ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.