2013-06-27 10 views
17

मॉडल लापता हैंडलिंग: डाक और उपयोगकर्तारेल 4 मजबूत पैरामीटर - मॉडल पैरामीटर हैश

पोस्ट belongs_to: उपयोगकर्ता
उपयोगकर्ता has_many: पदों

सरल।

कुछ उपयोगकर्ताओं का मानना ​​है कि हम एक पोस्ट के लिए संपादन पृष्ठ पर जाते हैं।

<%= form_for @post do |f| %> 

...

<% User.all.each do |user| %> 
    <div><%= f.radio_button "user_id", user.id %></div> 
<% end %> 

...

पोस्ट के नियंत्रक रेल 4 मजबूत मापदंडों लाभ उठाता है।

params.require(:post).permit(:user_id) 

मान लें कि संपादन पोस्ट फॉर्म में केवल रेडियो बटन फ़ील्ड के रूप में हैं।

समस्या: एक्शनकंट्रोलर :: पैरामीटर मिसिंग अपवाद फेंक दिया गया है। param नहीं मिला:

पोस्ट पैराम्स हैश का कारण कभी नहीं बनाया गया है, जिससे ऊपर अपवाद को फेंक दिया जा सकता है। उदाहरण के लिए खाली टेक्स्ट फ़ील्ड के विपरीत खाली रेडियो बटन, मॉडल के पैरा हैश को बनाए जाने के लिए ट्रिगर न करें।

क्या होगा अगर पोस्ट मॉडल को उपयोगकर्ता_आईडी वैध होने की आवश्यकता हो? निश्चित रूप से कोई ऐसा दृश्य फिर से प्रस्तुत करना चाहता है जिसके कारण पोस्ट सहेजा नहीं जा सकता है।

प्रश्न: रेल सम्मेलन में चिपके रहते हुए इस स्थिति को संभालने का एक शानदार तरीका क्या है?

अद्यतन:

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

+0

मेरे पास एक भी वीडर मुद्दा है ...मुझे मॉडल हैश के लिए एक ही पैराम नहीं मिला है, लेकिन मैं जो परीक्षण कर रहा हूं वह यूजर के दो फ़ील्ड के साथ @user है और यह है। मेरा यूआरएल उपयोगकर्ता नाम का उपयोग करता है और मुझे लगता है कि यह आईडी या कुछ खो रहा था। लेकिन मेरे पास मेरी परियोजना का एक और हिस्सा है जो वही काम करता है। केवल अंतर यह है कि मैंने इस फॉर्म को मचान के बजाए स्क्रैच से बनाया है ... – dtc

उत्तर

28

मुझे एक ही समस्या है, और इन उत्तरों में से कोई भी पसंद नहीं आया। रेल प्रलेखन (http://guides.rubyonrails.org/action_controller_overview.html#more-examples) में मैं निम्नलिखित समाधान देखें:

params.fetch(:blog, {}).permit(:title, :author) 

प्रभावी रूप से आप की डिफ़ॉल्ट आपूर्ति कर रहे हैं {}, जो काफी अच्छी तरह से (कम से कम मेरी स्थिति के लिए) काम करने के लिए लगता है।

अपने कोड के लिए आवेदन, आप होगा:

params.fetch(:post, {}).permit(:user_id) 

मुझे लगता है कि यह काफी साफ है, और मेरे कोड में काम करने लगता है।

+1

बहुत बढ़िया! यह वह समाधान था जिसे मैं सभी के साथ ढूंढ रहा था। – Ben

+0

पॉल पॉल धन्यवाद। तुमने मेरी जान बचाई। मैंने बेन के समाधान का उपयोग करने की भी कोशिश की लेकिन यह मुझे यह त्रुटि देता है: गुणों को आवंटित करते समय, आपको एक हैश को तर्क के रूप में पास करना होगा। – cyonder

4

यह मेरा तत्काल समाधान था ... हालांकि यह थोड़ा मूर्खतापूर्ण लगता है क्योंकि यदि आप पोस्ट नियंत्रक में स्पष्ट रूप से हैं तो आपको पोस्ट पैराम की जांच क्यों करनी है और आपको वैसे भी आवश्यकता है। बहुत counterintuitive लगता है। क्या यह वास्तव में सबसे अच्छा तरीका है?

params.require(:post).permit(:user_id) if params[:post] 
+0

हाँ यह काम करता है लेकिन मुझे समझ में नहीं आता है कि क्यों –

+2

@ कॉनोर लिच यह काम करता है क्योंकि मूल समस्या पैराम [: पोस्ट] नहीं बनाई गई है, और यदि मजबूत पैराम विधियों को चलाने से पहले बस इसके लिए जांच करता है। यदि परम बिल्कुल मौजूद नहीं हैं, तो विधि बस शून्य लौटाती है। नील सबसे अधिक काम करता है, अगर सभी मॉडल अद्यतन विधियों नहीं, तो सब कुछ काम करता है। मुझे यह बहुत पसंद नहीं है क्योंकि अगर पोस्ट पैराम मौजूद नहीं हैं (मजबूत पैरामीटर के पूरे बिंदुओं में से एक) तो अपवाद को फेंकने के लिए तैयार किया गया है। कुछ भी नहीं हो रहा है, जो मैं अपेक्षित व्यवहार पर विचार नहीं करता हूं। – Ben

+0

इसे पैराम [: पोस्ट] को नियंत्रक में भी मूल्य पैराम पर आगे बढ़ने की आवश्यकता होगी [: पोस्ट] [: user_id] –

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