रेल 4 में `params.require (: person) .permit (: नाम,: आयु)` क्या कर रहा है?


149

रेल में मजबूत मापदंडों के सभी उदाहरण 4 डॉक्स का उपयोग करते हैं

params.require(:person).permit(:name, :age)

किसी को deconstruct को खुश करें और बताएं कि क्या हो रहा है के साथ कर सके requireऔर permitयहाँ?


3
यह उदाहरण सीधे प्रलेखन से आता है, जो बताता है permitलेकिन नहीं require
एरिक ट्रॉटमैन

जवाबों:


202

paramsएक हैश की तरह एक नियंत्रक दिखता में, लेकिन यह वास्तव का एक उदाहरण है ActionController::Parameters, जो इस तरह के रूप में कई तरीके प्रदान requireऔर permit

requireविधि सुनिश्चित एक विशिष्ट पैरामीटर मौजूद है, और अगर यह प्रदान नहीं कर रहा है, कि requireविधि एक त्रुटि फेंकता है। यह ActionController::Parametersकुंजी में पारित के लिए एक उदाहरण देता है require

permitविधि मानकों ऑब्जेक्ट की प्रति देता है, केवल लौटने की अनुमति दी कुंजी और मूल्यों। एक नया ActiveRecord मॉडल बनाते समय, केवल अनुमत विशेषताओं को मॉडल में पारित किया जाता है।

यह बहुत हद तक सफेदी की तरह दिखता है जिसे पहले ActiveRecord मॉडल में शामिल किया गया था, लेकिन यह नियंत्रक के लिए अधिक समझ में आता है।


37
परमिट किसी अन्य हैश तो केवल कुंजी की अनुमति दी और (इस महत्वपूर्ण है) के साथ जवाब देंगे रिटर्न: परमिट का विवरण बंद एक सा है trueकरने के लिए permitted?विधि। डिफ़ॉल्ट रूप से, का एक उदाहरण ActionController::Parametersवर्ग वापस आ जाएगी falseके लिए permitted?जवाब trueकरने के लिए permitted?साधन पैरामीटर वस्तु जन काम में इस्तेमाल किया जा सकता है; और एप्लिकेशन फॉरबिडेंट एट्रिब्यूट्स त्रुटि को फेंक देगा।
18

3
चेनिंग करता है permitपर requireयह भी की अनुमति और लौट आए वस्तु में आवश्यक पैरामीटर शामिल?
डेनिस

मुझे नामकरण दुर्भाग्यपूर्ण लगता है, क्योंकि आवश्यकता के लिए एक आवश्यक पैरामीटर बनाने की तुलना में बहुत अधिक है। Params.permit (: person,: name,: age) का उपयोग करने से काम नहीं होता है, और एक विशिष्ट फॉर्म के लिए "अनपेक्षित पैरामीटर:: utf8" जैसी त्रुटियां उत्पन्न होती हैं।
डेमियन

6

अधिक सटीक होने के लिए, जब आप उदाहरण के लिए बनाते हैं। करने से .new(...), :personआवश्यकता से संकेतित हैश होना चाहिए और व्यक्ति हैश केवल परमिट द्वारा स्वीकार :nameऔर :ageसंकेत देगा ।

उदाहरण:

.new(person: { name: "Bhojendra", age: 32 }) // okay
.new(person: { name: "Rauniyar" }) // okay
.new(person: { name: "Bhojendra", other: 'asdf' }) // not okay, other not permitted
.new(person: { full_name: "Bhojendra Rauniyar" }) // not okay, full_name not permitted
.new(detail: { name: "Bhojendra", age: 32 }) // not okay, must be person

3 और 4 के not okayउदाहरण क्या कल्पना करते हैं?
p0k8_

@ p0k8_ मैंने स्पष्ट करने के लिए उत्तर संपादित किया। उन उदाहरणों में कुछ अलग क्षेत्र के नाम दिखाए गए हैं जिन्हें "अनुमति नहीं" दी गई थी।
हैरी वुड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.