কীভাবে শক্তিশালী পরামিতি সহ অ্যারেটিকে অনুমতি দেওয়া যায়


269

আমার কাছে একটি কার্যক্ষম রেলস 3 অ্যাপ রয়েছে যা has_many ব্যবহার করে: এমন সংঘের মাধ্যমে যা আমি এটি রেল 4 অ্যাপ হিসাবে রিমেক করি না, আমাকে রেল 4 সংস্করণে সম্পর্কিত মডেল থেকে আইডি সংরক্ষণ করতে দিয়েছি।

এই তিনটি প্রাসঙ্গিক মডেল দুটি সংস্করণের জন্য একই।

Categorization.rb

class Categorization < ActiveRecord::Base

  belongs_to :question
  belongs_to :category
end

Question.rb

has_many :categorizations
has_many :categories, through: :categorizations

Category.rb

has_many :categorizations
has_many :questions, through: :categorizations

উভয় অ্যাপ্লিকেশনগুলিতে, বিভাগ আইডির মতো ক্রিয়াকলাপটি পাস হতে চলেছে

  "question"=>{"question_content"=>"How do you spell car?", "question_details"=>"blah ", "category_ids"=>["", "2"],

রেল 3 অ্যাপে, যখন আমি একটি নতুন প্রশ্ন তৈরি করি, এটি প্রশ্ন সারণিতে এবং তারপরে শ্রেণিবদ্ধকরণ সারণিতে সন্নিবেশ করায়

 SQL (82.1ms)  INSERT INTO "questions" ("accepted_answer_id", "city", "created_at", "details", "province", "province_id", "question", "updated_at", "user_id") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)  [["accepted_answer_id", nil], ["city", "dd"], ["created_at", Tue, 14 May 2013 17:10:25 UTC +00:00], ["details", "greyound?"], ["province", nil], ["province_id", 2], ["question", "Whos' the biggest dog in the world"], ["updated_at", Tue, 14 May 2013 17:10:25 UTC +00:00], ["user_id", 53]]
  SQL (0.4ms)  INSERT INTO "categorizations" ("category_id", "created_at", "question_id", "updated_at") VALUES (?, ?, ?, ?)  [["category_id", 2], ["created_at", Tue, 14 May 2013 17:10:25 UTC +00:00], ["question_id", 66], ["updated_at", Tue, 14 May 2013 17:10:25 UTC +00:00]]

রেল 4 অ্যাপে, প্রশ্নকন্ট্রোলার # তৈরির পরামিতিগুলি প্রক্রিয়া করার পরে, আমি সার্ভার লগগুলিতে এই ত্রুটিটি পাচ্ছি

Unpermitted parameters: category_ids

এবং প্রশ্নটি কেবল প্রশ্ন সারণিতে sertedোকানো হচ্ছে

 (0.2ms)  BEGIN
  SQL (67.6ms)  INSERT INTO "questions" ("city", "created_at", "province_id", "question_content", "question_details", "updated_at", "user_id") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id"  [["city", "dd"], ["created_at", Tue, 14 May 2013 17:17:53 UTC +00:00], ["province_id", 3], ["question_content", "How's your car?"], ["question_details", "is it runnign"], ["updated_at", Tue, 14 May 2013 17:17:53 UTC +00:00], ["user_id", 12]]
   (31.9ms)  COMMIT

যদিও আমি প্রশ্নগুলিতে মডেলটির ক্যাটাগরি_আইডিগুলি সংরক্ষণ করছি না, আমি প্রশ্ন_নিয়ন্ত্রকের মধ্যে অনুমোদিত প্যারামিটার হিসাবে ক্যাটাগরি_আইডস সেট করেছি I

   def question_params

      params.require(:question).permit(:question_details, :question_content, :user_id, :accepted_answer_id, :province_id, :city, :category_ids)
    end

আমি কী ক্যাটাগরি_আইডস সংরক্ষণ করব? দ্রষ্টব্য, উভয় অ্যাপ্লিকেশন এর বিভাগ_কন্ট্রোলআরআরবিতে কোনও ক্রিয়াকলাপ নেই।

এটি তিনটি টেবিল যা উভয় অ্যাপ্লিকেশনে একই

 create_table "questions", force: true do |t|
    t.text     "question_details"
    t.string   "question_content"
    t.integer  "user_id"
    t.integer  "accepted_answer_id"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "province_id"
    t.string   "city"
  end

 create_table "categories", force: true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "categorizations", force: true do |t|
    t.integer  "category_id"
    t.integer  "question_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

হালনাগাদ

এটি রেল 3 অ্যাপ থেকে তৈরি ক্রিয়া

  def create
      @question = Question.new(params[:question])
      respond_to do |format|
      if @question.save
        format.html { redirect_to @question, notice: 'Question was successfully created.' }
        format.json { render json: @question, status: :created, location: @question }
      else
        format.html { render action: "new" }
        format.json { render json: @question.errors, status: :unprocessable_entity }
      end
    end
end

এটি রেল 4 অ্যাপ্লিকেশন থেকে তৈরি ক্রিয়া

   def create
      @question = Question.new(question_params)

       respond_to do |format|
      if @question.save
        format.html { redirect_to @question, notice: 'Question was successfully created.' }
        format.json { render json: @question, status: :created, location: @question }
      else
        format.html { render action: "new" }
        format.json { render json: @question.errors, status: :unprocessable_entity }
      end
    end
    end

এটি হল প্রশ্ন_প্রেমস পদ্ধতি

 private
    def question_params 
      params.require(:question).permit(:question_details, :question_content, :user_id, :accepted_answer_id, :province_id, :city, :category_ids)
    end

উভয় অ্যাপ্লিকেশনটিতে ক্রিয়া অ্যাকশনটি কেমন দেখাচ্ছে?
বেনিক

@ বেনিক আমি দুটি তৈরি ক্রিয়া যুক্ত করেছি। ধন্যবাদ
লিয়াক্সিম

উত্তর:


527

এই https://github.com/rails/ স্ট্রং_প্রেমিটারগুলি ডক্সের সম্পর্কিত বিভাগের মতো মনে হচ্ছে:

অনুমোদিত স্কেলারের প্রকারগুলি হ'ল স্ট্রিং, সিম্বল, নীলক্লাস, সংখ্যাসূচক, ট্রু ক্লাস, ফলসক্লাস, তারিখ, সময়, তারিখটাইম, স্ট্রিংআইও, আইও, অ্যাকশনডিস্পাচ :: এইচটিপি :: আপলোডড ফাইল এবং রাক :: পরীক্ষা :: আপলোডড ফাইল

প্যারামগুলিতে মান অবশ্যই অনুমোদিত স্কেলারের মানগুলির একটি অ্যারে হতে হবে তা খালি অ্যারেতে কীটি মানচিত্র করুন:

params.permit(:id => [])

আমার অ্যাপ্লিকেশনে, বিভাগ_IDগুলি একটি অ্যারেতে ক্রিয়া তৈরি করতে প্রেরণ করা হয়

"category_ids"=>["", "2"],

অতএব, শক্তিশালী পরামিতি ঘোষণার সময়, আমি স্পষ্টতই श्रेणी_আইডিকে একটি অ্যারে হিসাবে সেট করি

params.require(:question).permit(:question_details, :question_content, :user_id, :accepted_answer_id, :province_id, :city, :category_ids => [])

এখন পুরোপুরি কাজ করে!

( গুরুত্বপূর্ণ: মন্তব্যগুলিতে @ লার্ট নোট হিসাবে, অ্যারের ডিক্লেয়ারেশন অবশ্যই অ্যাট্রিবিউটস তালিকার শেষে হওয়া উচিত , অন্যথায় আপনি একটি বাক্য গঠন ত্রুটি পাবেন))


105
আমি আরও লক্ষ্য করেছি যে অ্যারেগুলির জন্য ঘোষণাগুলি বৈশিষ্ট্য তালিকার শেষে হওয়া উচিত। অন্যথায় আমি একটি সিনট্যাক্স ত্রুটি পেয়েছিsyntax error, unexpected ')', expecting =>
লেনার্ট

45
অ্যারে ডিক্লেয়ারেশন (নেস্টেড প্যারাম) শেষে যে কারণটি রয়েছে তা হ'ল অ্যাকশনকন্ট্রোলার :: প্যারামিটার.প্রেমিট প্রতিটি আর্গুমেন্টকে হ্যাশ বা একটি প্রতীক হিসাবে প্রত্যাশা করে। রুবি ম্যাজিক একটি মেথড কলের শেষে সমস্ত মূল মান জোড়গুলিকে একটি হ্যাশে পরিণত করবে, তবে আপনি যদি আপনার পদ্ধতি কলের সাথে কী / মান জোড়গুলির সাথে চিহ্নগুলি মিশ্রিত করেন তবে রুবি কী করতে হবে তা জানে না।
সমান

7
যদি category_idsকোনও অ্যারে না হয় (যেমন একটি স্ট্রিং প্রেরণ করা হয়েছিল) তবে রেলগুলি পুরোপুরি বাদাম হয়ে যায় এবং একটি উত্থাপন করে এটি ERROR TypeError: expected Array (got String) for param `category_ids'কি রেলের মধ্যে একটি বাগ আছে? সম্পাদনা: হ্যাঁ এটি: github.com/rails/rails/issues/11502
ডোমিনিক

4
@ লনার্ট ধন্যবাদ, আমি ভেবেছিলাম আমি পাগল হয়ে যাচ্ছি। এটি কমপক্ষে দৃ_়_প্রেমগুলি README
সেবাস্তিয়ালসো

3
@ সূচনা আপনি যদি সিনট্যাক্স ত্রুটি এড়াতে চান তবে আপনি এটি হ্যাশ হিসাবে যুক্ত করতে পারেন। params.permit(:foo, { bar: [] }, :zoo)
ফু বার চিড়িয়াখানা

99

আপনি যদি একটি হ্যাশের অ্যারের অনুমতি দিতে চান (বা জেএসএন an array of objectsএর দৃষ্টিকোণ থেকে)

params.permit(:foo, array: [:key1, :key2])

এখানে 2 টি বিষয় লক্ষ্য করুন:

  1. arraypermitপদ্ধতির শেষ যুক্তি হওয়া উচিত ।
  2. আপনার অ্যারেতে হ্যাশগুলির কীগুলি নির্দিষ্ট করা উচিত, অন্যথায় আপনি একটি ত্রুটি পাবেন Unpermitted parameter: array, যা এই ক্ষেত্রে ডিবাগ করা খুব কঠিন।

এবং অ্যারেগুলির অ্যারেগুলি সমর্থিত নয় (এখনও): github.com/rails/rails/issues/23640
Andrei Dziahel

11
arrayশেষে থাকার দরকার নেই, তবে আপনার বৈধ রুবি রয়েছে কিনা তা নিশ্চিত করা দরকার। params.permit(:foo, array: [:key1, :key2], :bar)ইন্টারপ্রেটার হ্যাশ কী প্রত্যাশার সাথে বৈধ রুবি হবে না: প্রথম সেট পরে মান জোড়। বৈধ রুবি পেতে আপনার প্রয়োজনparams.permit(:foo, {array: [:key1, :key2]}, :bar)
মাস্তাব্লাস্টা

তুমি চ্যাম্প!
ললিপপ

22

এটা মত হওয়া উচিত

params.permit(:id => [])

রেল সংস্করণ 4+ যেহেতু আপনি ব্যবহার করতে পারেন:

params.permit(id: [])

12
অ্যারেটি অনুমতি পদ্ধতির শেষ যুক্তি হওয়া উচিত নয় দয়া করে
মাটিয়াস এলোরিয়াগা

3
সেই হ্যাশ সিনট্যাক্স যা আপনি বলেছেন রইল ভি 4+ এর জন্য প্রয়োগ করা হ'ল এটি আসলে রুবি ১.৯ এবং আরও
নতুনতে

11

আপনার যদি এর মতো হ্যাশ কাঠামো থাকে:

Parameters: {"link"=>{"title"=>"Something", "time_span"=>[{"start"=>"2017-05-06T16:00:00.000Z", "end"=>"2017-05-06T17:00:00.000Z"}]}}

তারপরে আমি এটি কাজ করতে পেলাম:

params.require(:link).permit(:title, time_span: [[:start, :end]])

6

আমি এখনও মন্তব্য করতে পারছি না তবে ফেলো অপরিচিত সমাধানটি অনুসরণ করে আপনি কী কী ক্ষেত্রে মানগুলি অ্যারে রয়েছে সেই ক্ষেত্রে বাসা বাঁধতে পারেন। এটার মত:

filters: [{ name: 'test name', values: ['test value 1', 'test value 2'] }]

এইটা কাজ করে:

params.require(:model).permit(filters: [[:name, values: []]])
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.