নেস্টেড বৈশিষ্ট্যগুলি অনির্দিষ্ট পরামিতিগুলি


127

আমার একটি Billঅবজেক্ট রয়েছে, যার অনেকগুলি Dueঅবজেক্ট রয়েছে। Dueবস্তুর একটি জন্যে Person। আমি এমন একটি ফর্ম চাই যা একটি পৃষ্ঠাতে Billএবং তার শিশুদের Duesসমস্ত তৈরি করতে পারে । আমি এই রেইলকাস্টের অনুরূপ নেস্টেড গুণাবলী ব্যবহার করে একটি ফর্ম তৈরি করার চেষ্টা করছি ।

প্রাসঙ্গিক কোড নীচে তালিকাভুক্ত করা হয়েছে:

due.rb

class Due < ActiveRecord::Base
    belongs_to :person
    belongs_to :bill
end

bill.rb

class Bill < ActiveRecord::Base
    has_many :dues, :dependent => :destroy 
    accepts_nested_attributes_for :dues, :allow_destroy => true
end

bills_controller.rb

  # GET /bills/new
  def new
      @bill = Bill.new
      3.times { @bill.dues.build }
  end

বিল / _form.html.erb

  <%= form_for(@bill) do |f| %>
    <div class="field">
        <%= f.label :company %><br />
        <%= f.text_field :company %>
    </div>
    <div class="field">
        <%= f.label :month %><br />
        <%= f.text_field :month %>
    </div>
    <div class="field">
        <%= f.label :year %><br />
        <%= f.number_field :year %>
    </div>
    <div class="actions">
        <%= f.submit %>
    </div>
    <%= f.fields_for :dues do |builder| %>
        <%= render 'due_fields', :f => builder %>
    <% end %>
  <% end %>

বিল / _due_fields.html.erb

<div>
    <%= f.label :amount, "Amount" %>        
    <%= f.text_field :amount %>
    <br>
    <%= f.label :person_id, "Renter" %>
    <%= f.text_field :person_id %>
</div>

বিলস-কন্ট্রোলআরআরবিতে আপডেট করুন এটি কাজ করে!

def bill_params 
  params
  .require(:bill)
  .permit(:company, :month, :year, dues_attributes: [:amount, :person_id]) 
end

সঠিক ক্ষেত্রগুলি পৃষ্ঠায় রেন্ডার করা হয়েছে (যদিও Personএখনও ড্রপডাউন ছাড়াই ) এবং জমা দেওয়া সফল। তবে, বাচ্চার পাওনাগুলির কোনওটিই ডেটাবেজে সংরক্ষিত হয় না এবং সার্ভার লগে একটি ত্রুটি নিক্ষেপ করা হয়:

Unpermitted parameters: dues_attributes

ত্রুটির ঠিক আগে লগটি এটি প্রদর্শন করে:

Started POST "/bills" for 127.0.0.1 at 2013-04-10 00:16:37 -0700
Processing by BillsController#create as HTML<br>
Parameters: {"utf8"=>"✓", 
"authenticity_token"=>"ipxBOLOjx68fwvfmsMG3FecV/q/hPqUHsluBCPN2BeU=",
 "bill"=>{"company"=>"Comcast", "month"=>"April ", 
"year"=>"2013", "dues_attributes"=>{
"0"=>{"amount"=>"30", "person_id"=>"1"}, 
"1"=>{"amount"=>"30", "person_id"=>"2"},
 "2"=>{"amount"=>"30", "person_id"=>"3"}}}, "commit"=>"Create Bill"}

রেল 4 এ কিছু পরিবর্তন হয়েছে?


5
বিন্যাসে স্থির করুন: params.require (: বিল)। পারমিট (: সংস্থা,: মাস,: বছর,: পাওনা_সত্তা => [: পরিমাণ,: ব্যক্তি_আইডি])
অ্যান্ডি কোপলি

উত্তর:


187

দেখে মনে হচ্ছে অ্যাট্রিবিউট সুরক্ষা হ্যান্ডলিংয়ে একটি পরিবর্তন এসেছে এবং এখন আপনাকে অবশ্যই নিয়ামকটিতে (মডেলটিতে অ্যাট্রি_স্যাক্সেসযোগ্য পরিবর্তে) হোয়াইটলিস্ট করতে হবে কারণ পূর্ববর্তী alচ্ছিক রত্নটি শক্তিশালী_পরিমিতিগুলি রেল কোরের অংশ হয়ে গিয়েছিল।

এটি দেখতে এই জাতীয় কিছু দেখা উচিত:

class PeopleController < ActionController::Base
  def create
    Person.create(person_params)
  end

private
  def person_params
    params.require(:person).permit(:name, :age)
  end
end

তাই params.require(:model).permit(:fields)ব্যবহার করা হবে

এবং নেস্টেড অ্যাট্রিবিউটগুলির জন্য এমন কিছু

params.require(:person).permit(:name, :age, pets_attributes: [:id, :name, :category])

রুবি প্রান্তের এপিআই ডক্স এবং গিথুব বা শক্তিশালী_প্রেমিটারগুলিতে আরও কিছু বিশদ পাওয়া যাবে


1
আমি আমার বিলকন্ট্রোলারটিকে দেখতে দেখতে এটি পরিবর্তন করেছি: def bill_params params.require(:bill).permit(:company, :month, :year, :dues_attributes[:amount, :person_id]) end আমি এখন এই ত্রুটিটি পাচ্ছি:
প্রতীকটির

2
ঠিক আছে, এটি কোলনকে সঠিক জায়গায় রাখতে সহায়তা করে ... এটি ঠিক করা দরকার। ধন্যবাদ @ থারস্টেন-মুলার!
জ্যাঙ্কিপার

88
আইডি ভুলে যাবেন না !!!! pets_attributes: [:id, :name, :category]অন্যথায়, আপনি সম্পাদনা করার সময়, প্রতিটি পোষা প্রাণী আবার তৈরি হবে।
আর্কিলে

8
আপনাকে করতে হবে Person.create(person_params)বা এটি পদ্ধতিতে কল করবে না। পরিবর্তে আপনি পাবেন ActiveModel::ForbiddenAttributesError
andorov

16
এছাড়াও, আপনি যদি ফর্মটি থেকে আইটেমগুলি ধ্বংস করতে চান তবে আপনার গোপন :_destroyপ্যারামিটারটিও হোয়াইটলিস্ট করতে হবে । অর্থাত্pets_attributes: [:id, :name, :category, :_destroy]
প্যাথোজেন

21

ডক্স থেকে

To whitelist an entire hash of parameters, the permit! method can be used

params.require(:log_entry).permit!

নেস্টেড বৈশিষ্ট্যগুলি হ্যাশ আকারে। আমার অ্যাপ্লিকেশনটিতে আমার কাছে একটি প্রশ্ন.আরবি মডেল একটি উত্তর.আরবি মডেলের (যেখানে ব্যবহারকারী তার তৈরি করা প্রশ্নের উত্তরগুলির পছন্দগুলি তৈরি করে) এর জন্য নেস্টেড বৈশিষ্ট্যগুলি গ্রহণ করে। প্রশ্ন_ নিয়ন্ত্রণকারীতে, আমি এটি করি

  def question_params

      params.require(:question).permit!

  end

নীচে থাকা উত্তর বৈশিষ্ট্য সহ প্রশ্ন হ্যাশের সমস্ত কিছুরই অনুমতি রয়েছে। নেস্টেড বৈশিষ্ট্যগুলি অ্যারের আকারে থাকলে এটিও কাজ করে।

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


দুর্দান্ত, আমি স্পষ্টভাবে একটি পরিসীমা প্যারামিটারের অনুমতি পাব না, এটি আমার কয়েক ঘন্টা বাঁচায়।
বারটেক স্কুইরা

3
হ্যাঁ। সাধারণত একটি সম্ভাব্য সুরক্ষা উদ্বেগ হিসাবে দেখা হয়। আপনি যদি ব্যবহারকারী প্রশাসক হন তবে আপনি কেবল সত্যই এটি ব্যবহার করতে চান তবে তারপরেও আমি এর ব্যবহার সম্পর্কে সতর্ক থাকব।
8

6
আমার নেস্টেড বৈশিষ্ট্যগুলিও একটি অ্যারেতে রয়েছে। কি .permit!একমাত্র বিকল্প? আমি অনুমোদিত সমস্ত মডেলের বৈশিষ্ট্যগুলির সাথে এটি কাজ করতেও পারি না কারণ এটি অ্যারেতে চাপ দেয়।
ক্লিফটন ল্যাব্রাম


12

আসলে সমস্ত নেস্টেড পরামিতিগুলিকে কেবল সাদা তালিকাভুক্ত করার একটি উপায় রয়েছে।

params.require(:widget).permit(:name, :description).tap do |whitelisted|
  whitelisted[:position] = params[:widget][:position]
  whitelisted[:properties] = params[:widget][:properties]
end

এই পদ্ধতির অন্যান্য সমাধানগুলির চেয়ে সুবিধা রয়েছে। এটি গভীর-নেস্টেড প্যারামিটারগুলিকে অনুমতি দেয়।

অন্য সমাধান যেমন:

params.require(:person).permit(:name, :age, pets_attributes: [:id, :name, :category])

না।


উৎস:

https://github.com/rails/rails/issues/9454#issuecomment-14167664


3

আজ আমি এই একই সমস্যাটি পেয়েছি, রেল 4 এ কাজ করার সময়, আমি আমার ক্ষেত্রগুলি কাঠামোগত করে এটিকে কাজ করতে সক্ষম হয়েছি_এর জন্য:

<%= f.select :tag_ids, Tag.all.collect {|t| [t.name, t.id]}, {}, :multiple => true %>

তারপরে আমার নিয়ামকটিতে আমার শক্তিশালী প্যারামগুলি রয়েছে:

private
def post_params
    params.require(:post).permit(:id, :title, :content, :publish, tag_ids: [])
end

সব কাজ!


হাই আপনাকে ধন্যবাদ কিংসলে আইজোমাহ - যদি আপনি বাচ্চাদের নির্দিষ্ট বৈশিষ্ট্যগুলি সাদা করতে চান তবে কী হবে?
বিকেএসপুরজন

1

আপনি যদি কোনও JSONB ক্ষেত্র ব্যবহার করেন, আপনাকে অবশ্যই এটি .to_json (আরওআর) দিয়ে JSON এ রূপান্তর করতে হবে

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