रेल 4 - मजबूत पैरामीटर - नेस्टेड ऑब्जेक्ट


144

मुझे एक बहुत आसान सा सवाल मिला है। लेकिन अभी तक कोई समाधान नहीं मिला है।

तो यहाँ JSON स्ट्रिंग मैं सर्वर को भेज दिया गया है:

{
  "name" : "abc",
  "groundtruth" : {
    "type" : "Point",
    "coordinates" : [ 2.4, 6 ]
  }
}

नई परमिट विधि का उपयोग करते हुए, मुझे मिल गया है:

params.require(:measurement).permit(:name, :groundtruth)

यह कोई त्रुटि नहीं फेंकता है, लेकिन निर्मित डेटाबेस प्रविष्टि में nullग्राउंडट्रूथ मान के बजाय होता है ।

अगर मैं अभी सेट करता हूं:

params.require(:measurement).permit!

सब कुछ प्राप्त की उम्मीद के रूप में सहेज लिया जाता है, लेकिन निश्चित रूप से, इस मजबूत मापदंडों द्वारा प्रदान की सुरक्षा को मारता है।

मैं समाधान, सरणियों की अनुमति के लिए कैसे, लेकिन एक भी उदाहरण नेस्टेड वस्तुओं का उपयोग कर पाया है। यह किसी भी तरह से संभव होना चाहिए, क्योंकि यह एक बहुत ही सामान्य उपयोग का मामला होना चाहिए। तो यह कैसे काम करता है?



1
@vinodadhikary यह सही था ... मुझे लगता है कि ओपी भ्रमित है। जब आप नेस्टेड विशेषताओं की अनुमति देना चाहते हैं, तो यह उतना ही अजीब है जितना आप सरणी के भीतर नेस्टेड ऑब्जेक्ट की विशेषताओं को निर्दिष्ट करते हैं। दूसरी ओर यदि आप कई वस्तुओं की नेस्ट करना चाहते हैं तो आप एक हैश अंदर लपेट ... देखना api.rubyonrails.org/classes/ActionController/... और github.com/rails/rails/blob/master/actionpack/lib/...
j03w

@ j03w, स्रोत के लिंक के लिए धन्यवाद। यह अब स्पष्ट है। आपको इस खोज के लिए यहां एक उत्तर जोड़ना चाहिए क्योंकि मुझे लगता है कि यह अन्य लोगों की बहुत मदद करेगा।
वीटी

जवाबों:


181

जब आप नेस्टेड विशेषताओं की अनुमति देना चाहते हैं तो यह उतना ही अजीब होता है जितना आप किसी सरणी के भीतर नेस्टेड ऑब्जेक्ट की विशेषताओं को निर्दिष्ट करते हैं। आपके मामले में यह होगा

अद्यतन के रूप में @RafaelOliveira ने सुझाव दिया

params.require(:measurement)
      .permit(:name, :groundtruth => [:type, :coordinates => []])

दूसरी ओर यदि आप कई वस्तुओं का नेस्टेड चाहते हैं तो आप इसे हैश के अंदर लपेटते हैं ... इस तरह

params.require(:foo).permit(:bar, {:baz => [:x, :y]})


रेल वास्तव में इस पर बहुत अच्छे दस्तावेज हैं: http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-permit

अधिक स्पष्टीकरण के लिए, आप के कार्यान्वयन पर दिखाई दे सकता है permitऔर strong_parametersअपने आप में: https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/strong_parameters.rb#L246-L247


5
इस मामले में दोनों मामले समान हैं, वास्तव में, यह सिर्फ इतना है कि घुंघराले कोष्ठक {: groundtruth => [[...}} के आसपास वैकल्पिक हैं; यह एक हैश है लेकिन दुभाषिया यह निर्धारित करने में सक्षम है कि स्पष्ट घुंघराले कोष्ठक के बिना हैश कहां से शुरू और समाप्त होता है।
बोल रहा हूँ

विशेषताओं के नेस्टेड सरणियों नेस्टेड विशेषताओं की अनुमति नहीं देते हैं। नेस्टेड गुण और attr_accessor "unpermitted पैरामीटर" के रूप में अपने आवेदन में सूचीबद्ध हैं। फिर भी सुरक्षित समाधान की तलाश में।
कतार्ज़ीना

कई नेस्टेड वस्तुओं के मामले में, आपको आईडी को काम करने के लिए भी अनुमति देनी चाहिए। यहाँ अधिक जानकारी: stackoverflow.com/questions/18308714/…
फेब्रीस कार्रेगा

1
यह केवल नेस्टेड विशेषताओं के एक सेट की अनुमति देता है। यह एक से कई के मामले में काम नहीं करेगा।
AKWF

23

मुझे यह सुझाव मेरे मामले में उपयोगी लगा:

  def product_params
    params.require(:product).permit(:name).tap do |whitelisted|
      whitelisted[:data] = params[:product][:data]
    end
  end

इस चेक लिंक GitHub पर जेवियर्स टिप्पणी की।

यह दृष्टिकोण संपूर्ण पाराम [: माप] [: ग्राउंडट्रूथ] वस्तु को श्वेतसूची में बदल देता है।

मूल प्रश्न विशेषताओं का उपयोग करना:

  def product_params
    params.require(:measurement).permit(:name, :groundtruth).tap do |whitelisted|
      whitelisted[:groundtruth] = params[:measurement][:groundtruth]
    end
  end

4
बस एक साइड नोट, यह अभी भी लॉग में अप्रमाणित मापदंडों के रूप में दिखाई देगा, लेकिन मॉडल उन्हें वैसे भी स्वीकार करेगा।
वेस्टन गैंगर

5
यकीन है कि रेल 4 की नहीं, लेकिन मेरे रेल 5 परियोजना में मैं कॉल करनी होगी permit!श्वेत सूची में होना करने के लिए या फिर इसे दोहन के बाद unpermitted बना रहा है। इस स्थिति में यह होगाparams[:measurement][:groundtruth].permit!
nayiaw

@nayiaw के पास भी अनपेक्षित संदेश मिलता है, लेकिन permit!इस त्रुटि को बढ़ाता है NoMethodError (undefined method ! ' # <Array के लिए: 0x007f80cb71ea00>): `
wuliwong

@wuliwong permit!विधि में उपलब्ध नहीं है Array। आपको संबंधित वर्ग के उदाहरण का उपयोग करने की आवश्यकता होगी permit!(यह एक समय हो गया है इसलिए मैं कक्षा का नाम भूल गया हूं लेकिन यह इस पृष्ठActionController::Parameters पर आधारित कुछ है )।
नियाव

8

नेस्टेड ऑब्जेक्ट की अनुमति देना:

params.permit( {:school => [:id , :name]}, 
               {:student => [:id, 
                            :name, 
                            :address, 
                            :city]},
                {:records => [:marks, :subject]})

0

यदि यह नई हैश संकेतन के कारण रेल 5 है, तो params.permit(:name, groundtruth: [:type, coordinates:[]])ठीक काम करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.