রেল 4 - শক্তিশালী পরামিতি - নেস্টেড অবজেক্টস


144

আমি একটি খুব সহজ প্রশ্ন পেয়েছি। তবে এখনও অবধি কোনও সমাধান খুঁজে পেল না।

সুতরাং আমি এখানে সার্ভারে প্রেরিত JSON স্ট্রিং:

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

নতুন পারমিট পদ্ধতিটি ব্যবহার করে, আমি পেয়েছি:

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

এটি কোনও ত্রুটি ছুঁড়ে না, তবে তৈরি ডাটাবেস এন্ট্রিটিতে nullগ্রাউন্ডথ্রুথ মানটির পরিবর্তে থাকে contains

যদি আমি কেবল সেট করি:

params.require(:measurement).permit!

প্রত্যাশার মতো সবকিছুই সংরক্ষিত হয়ে যায় তবে অবশ্যই এটি শক্তিশালী পরামিতিগুলির দ্বারা সরবরাহিত সুরক্ষাটিকে হত্যা করে।

আমি সমাধানগুলি খুঁজে পেয়েছি, কীভাবে অ্যারেগুলিকে অনুমতি দেওয়া যায়, তবে নেস্টেড অবজেক্টগুলি ব্যবহার করে একটি উদাহরণ নেই not এটি অবশ্যই কোনওভাবেই সম্ভব, যেহেতু এটি খুব সাধারণ ব্যবহারের ক্ষেত্রে হওয়া উচিত। সুতরাং কিভাবে এটি কাজ করে?



1
@ভিনোদাধিকারী এটি সঠিক ছিল ... আমি মনে করি ওপি বিভ্রান্ত আপনি যেমন নেস্টেড অ্যাট্রিবিউটসকে অনুমতি দিতে চান এটির মতই বিজোড় আপনি অ্যারের মধ্যে নেস্টেড অবজেক্টের বৈশিষ্ট্যগুলি নির্দিষ্ট করেন। অন্যদিকে আপনি যদি একাধিক বস্তুর নেস্ট করতে চান তবে আপনি এটিকে একটি হ্যাশের অভ্যন্তরে আবৃত করুন ... দেখুন api.rubyonrails.org/class/ActionController/… এবং github.com/rails/rails/blob/master/actionpack/lib/…
j03w

@ j03w, উত্সের লিঙ্কের জন্য ধন্যবাদ। এটা এখন পরিষ্কার। এই সন্ধানের জন্য আপনার এখানে একটি উত্তর যুক্ত করা উচিত কারণ আমি মনে করি এটি অন্যান্য অনেক লোককে সহায়তা করবে।
ভি

উত্তর:


181

এটি যখন শোনা যায় তত অদ্ভুত আপনি যখন নেস্টেড বৈশিষ্ট্যগুলিকে অনুমতি দিতে চান তবে আপনি কোনও অ্যারের মধ্যে নেস্টেড অবজেক্টের বৈশিষ্ট্যগুলি নির্দিষ্ট করেন। আপনার ক্ষেত্রে এটি হবে

@ রাফায়েলঅলিভির পরামর্শ অনুসারে আপডেট করুন

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/ স্ট্র_paraters.rb#L246-L247


5
এই উত্তরের ক্ষেত্রে উভয় ক্ষেত্রেই একইরকম, আসলে, কোঁকড়ানো বন্ধনীগুলি প্রায় optionচ্ছিক ground: গ্রাউন্ডথ্রুথ => [...]}; এটি একটি হ্যাশ তবে স্পষ্টত কোঁকড়া বন্ধনী ছাড়াই হ্যাশটি কোথায় শুরু হয় এবং শেষ হয় তা দোভাষী তা নির্ধারণ করতে সক্ষম হন।
speakingcode

বৈশিষ্ট্যগুলির নেস্টেড অ্যারেগুলি নেস্টেড বৈশিষ্ট্যগুলিকে অনুমতি দেয় না। নেস্টেড অ্যাট্রিবিউটস এবং অ্যাট্রি_অ্যাকসেসর আমার অ্যাপ্লিকেশনটিতে "আনপ্রেসিড প্যারামিটার" হিসাবে তালিকাভুক্ত রয়েছে। এখনও নিরাপদ সমাধান খুঁজছেন for
কাটারজেনা

একাধিক নেস্টেড অবজেক্টের ক্ষেত্রে, আপনার এটির জন্য আইডিরও অনুমতি দেওয়া উচিত। এখানে আরও তথ্য: স্ট্যাকওভারফ্লো
ফ্যাব্রিস কারেগা

1
এটি কেবল নেস্টেড বৈশিষ্ট্যের এক সেটকে অনুমতি দেয়। একের ক্ষেত্রে অনেকের ক্ষেত্রে এটি কাজ করবে না।
কেডব্লিউএফ

23

আমি এই পরামর্শটি আমার ক্ষেত্রে দরকারী বলে মনে করেছি:

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

গিথুবে জাভিয়ের মন্তব্যের এই লিঙ্কটি দেখুন Check

এই পদ্ধতির পুরো প্যারামগুলি [: পরিমাপ] [: গ্রাউন্ডথ্রুথ] অবজেক্টকে শ্বেত তালিকাভুক্ত করা হয়েছে।

মূল প্রশ্নগুলির বৈশিষ্ট্যগুলি ব্যবহার করে:

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

4
কেবলমাত্র একটি পার্শ্ব নোট, এটি এখনও নিরীক্ষিত পরামিতি হিসাবে লগে প্রদর্শিত হবে তবে মডেল যেভাবেই সেগুলি গ্রহণ করবে।
ওয়েস্টন গাঙ্গার

5
রেল 4 সম্পর্কে নিশ্চিত নন তবে আমার রেল 5 প্রকল্পে আমাকে permit!শ্বেত তালিকাভুক্ত হওয়ার জন্য কল করতে হবে অন্যথায় এটি ট্যাপ করার পরে এটি নিরীক্ষণ থেকে যায়। এই ক্ষেত্রে এটি হবেparams[:measurement][:groundtruth].permit!
nayiaw

@ নয়ায়াউ আমিও অনির্বাচিত বার্তাটি পেয়েছি তবে যুক্ত করার permit!ফলে এই ত্রুটি NoMethodError (undefined method অনুমতিটি বাড়িয়েছে ! ' # <অ্যারে: 0x007f80cb71ea00>) এর জন্য: `
উলিওং

@ উলিওং 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:[]])ভাল কাজ করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.