2009-04-15 7 views
7

में URL क्वेरी से बहुमान क्षेत्र पार्स करने के लिए मैं प्रपत्र http://www.example.com?foo=one&foo=twoकैसे रेल

मैं foo के लिए ['one', 'two'] मूल्यों की एक सरणी प्राप्त करना चाहते हैं की एक यूआरएल है, लेकिन params[:foo] केवल पहले मान देता है।

मुझे पता है कि अगर मैंने URL में foo के बजाय foo[] का उपयोग किया है, तो params[:foo] मुझे वांछित सरणी देगा।

हालांकि, यदि संभव हो तो मैं यूआरएल की संरचना को बदलने से बचना चाहता हूं, क्योंकि इसका फॉर्म क्लाइंट एप्लिकेशन के लिए एक नमूना के रूप में प्रदान किया जाता है। पैरामीटर नाम बदलने के बिना सभी मूल्यों को प्राप्त करने का कोई अच्छा तरीका है?

उत्तर

13

तुम इतनी तरह एक रेल नियंत्रक में क्वेरी स्ट्रिंग पार्स करने डिफ़ॉल्ट रूबी सीजीआई मॉड्यूल का उपयोग कर सकते हैं:

params = CGI.parse(request.query_string) 

यह आपको दे देंगे आप क्या चाहते हैं, लेकिन ध्यान दें कि आप रेल के किसी भी नहीं मिलेगा क्वेरी स्ट्रिंग पार्सिंग के लिए अन्य एक्सटेंशन, जैसे कि HashWithIndifferentAccess का उपयोग करना, इसलिए आपको सिंबल कुंजी की बजाय स्ट्रिंग करना होगा।

इसके अलावा, मुझे विश्वास नहीं है कि आप एक ही पंक्ति के साथ पैरा सेट कर सकते हैं और डिफ़ॉल्ट रेल पैराम सामग्री को ओवरराइट कर सकते हैं। आप इस बदलाव को कितना व्यापक चाहते हैं, इस पर निर्भर करते हुए, आपको पैच बंदर या आंतरिक को थोड़ा सा हैक करने की आवश्यकता हो सकती है। हालांकि शीघ्र बात आप चाहते थे, तो एक वैश्विक परिवर्तन application.rb में फिल्टर से पहले एक में इस डाल दिया और जैसे @raw_params

+0

एक आकर्षण की तरह काम करता है, धन्यवाद। मुझे बस एक नियंत्रक में एक ही स्थान पर इसकी आवश्यकता थी, इसलिए मुझे पैराम्स के साथ भीड़ की आवश्यकता नहीं थी। – ykaganovich

2

एक नया उदाहरण वर मैं CGI.parse (request.query_string) समाधान एक और जवाब में बताया गया की तरह उपयोग करने के लिए किया जाएगा। आप कस्टम पार्सड क्वेरी स्ट्रिंग को पैराम्स में मर्ज करने के लिए ऐसा कर सकते हैं:

params.merge!(CGI.parse(request.query_string).symbolize_keys) 
+8

स्वचालित रूप से प्रतीकात्मक रूप से आपके आवेदन पर एक डीओएस हमले के लिए खुल जाएगा। रूबी कभी कचरा प्रतीक उदाहरण इकट्ठा नहीं करता है, इस प्रकार वे स्मृति में चारों ओर रहते हैं, कुछ भी नहीं करते हैं, जब तक ऐप रीबूट नहीं हो जाता है। –

+1

@ FrançoisBeausoleil - क्या आपके पास एक लिंक है जो इस मुद्दे को अधिक विस्तार से बताता है? क्या यह अभी भी रूबी 1.9.2/रेल 3 में चिंता का विषय है? –

+0

@MattHuggins - https://bugs.ruby-lang.org/issues/7791 देखें। और मुद्दा 2.2 में हल किया जाना चाहिए। –