2012-08-22 17 views
7

docs on parameter wrapping राज्य:रेल पैरामीटर रैपिंग क्यों नहीं करता है जिसमें यूआरआई से चीजें शामिल हैं?

Wraps मापदंडों एक नेस्टेड हैश में हैश। यह ग्राहकों को किसी रूट तत्व निर्दिष्ट किए बिना POST अनुरोध सबमिट करने की अनुमति देगा।

यह मदद करता है जो पैरामीटर हैश लपेटा जा रहा है।

रेल params हैश में अनुरोध के साथ भेजा मानकों के सभी एकत्र करता है, चाहे वे क्वेरी स्ट्रिंग या पोस्ट शरीर के हिस्से के रूप में भेजे जाते हैं: Action Controller overview guide इस संक्षिप्त जानकारी दी गई देता है। [...] query_parameters हैश में पैरामीटर शामिल हैं जो क्वेरी स्ट्रिंग के हिस्से के रूप में भेजे गए थे जबकि request_parameters हैश में पोस्ट बॉडी के हिस्से के रूप में भेजे गए पैरामीटर शामिल हैं। path_parameters हैश में पैरामीटर शामिल हैं जिन्हें रूटिंग द्वारा इस विशेष नियंत्रक और क्रिया के लिए पथ के हिस्से के रूप में पहचाना जाता है।

मज़ा तब होता है जब आप रीस्टफुल संसाधनों और मार्गों का उपयोग करते हैं। मान लें कि आपके पास एक मॉडल ए है जिसमें has_many बीएस है; बी इस प्रकार एक विदेशी कुंजी a_id है।

आप POST /as/1/bs खाली पेलोड के साथ (क्योंकि बी के पास कोई अन्य फ़ील्ड नहीं है)। a_id मानना ​​attr_accessible है, कोई यह मान सकता है कि a_idb ऑब्जेक्ट में लपेटा जाएगा। इसके बजाय आप देखेंगे:

Processing by BsController#create as HTML 
    Parameters: {"b"=>{}, "a_id" => "1"} 

ऐसी कोई किस्मत नहीं। यह पता चला है कि ParamsWrapper uses request_parameters और params नहीं है, इसलिए POST पेलोड में a_id सहित इसका अर्थ यह नहीं है कि यह लपेटा नहीं जाता है। यह बहुत भ्रमित है, क्योंकि आप अभी भी इसे params में शामिल करते हैं, यूआरआई ग्लोबिंग के कारण, और आश्चर्य की बात है कि यह सभी चीजों को क्यों छोड़ दिया गया।

क्या request_parameters का उपयोग करने के लिए कोई अच्छा कारण नहीं है और params यहां नहीं है?

मैं समझ सकता हूं कि, "आरईएसटी दर्शन" बिंदु से, यह अधिक शुद्ध है अगर हम मानते हैं कि पेलोड में पूरी वस्तु है, लेकिन इसका अनिवार्य रूप से मतलब है कि यूआरआई में a_id पूरी तरह से अनदेखा किया गया है, जो लगता है अफ़सोस की बात है।

tl; डॉ:ParamsWrapperrequest_parameters पैरामीटर स्रोत के रूप में उपयोग करता है, तो यूआरआई-globbed चर को छोड़ दिया जाता है। क्या यह एक रेल बग है? शुद्ध आरईएसटी वकील नहीं कह सकते हैं, लेकिन व्यावहारिकता हां सुझाती है।

+0

नमस्कार! क्या आपने यह पता लगाया है कि इस मुद्दे को कैसे प्राप्त किया जाए? – dan

+1

@ डैन: दुर्भाग्य से मैंने इस प्रश्न को पोस्ट करने के कुछ महीनों बाद रेल के साथ काम नहीं किया है, इसलिए मेरे पास कुछ भी नहीं है! – Ashe

उत्तर

0

जहां तक ​​मैं समझता हूं, 'बी' के लिए हैश में a_id शामिल नहीं है, इसलिए हमें उस आईडी मान की आवश्यकता है कि हमारे डेटाबेस में रिकॉर्ड मौजूद है या नहीं। इस तरह, हम अनुरोध में अन्य पैरा को अस्वीकार कर सकते हैं। 'बी' हैश में शामिल न करने के कारण के अनुसार: यह दुर्घटनाओं को रोक सकता है। इस परिदृश्य को लें: मान लीजिए कि कोई कोई फॉर्म अपडेट कर रहा है और मॉडल ऑब्जेक्ट के लिए तर्क के रूप में पूर्ण 'बी' हैश पास करता है। अब जब हम model_object.save को कॉल करते हैं, तो यह पुराने रिकॉर्ड को अपडेट करने के बजाय हमारे डेटाबेस में रिकॉर्ड को सहेज सकता है जो एक सुरक्षा खतरा होगा (यदि ऑब्जेक्ट पहले शुरू किया गया हो तो हो सकता है)। पूर्ण प्रमाण परिदृश्य नहीं है, लेकिन कोडिंग करते समय दुर्घटनाएं होती हैं और यह हमें ऐसी दुर्घटनाओं को रोकने में मदद कर सकती है।

0

अपने विशिष्ट उपयोग के पर निर्भर करता है, लेकिन आप अपने नियंत्रक में मजबूत पैरामीटर उपयोग कर रहे हैं, या तो आप

params[:b][:a_id] = params[:a_id] 
params.require(:b).permit(:a_id) 

कर सकते हैं या सिर्फ विधि "की आवश्यकता होती है" पूरी तरह से छोड़:

params.permit(:a_id)