কীভাবে কোনও ক্ষেত্রকে প্যারামগুলি থেকে সরিয়ে ফেলা যায় [: কিছু]


116

আমার নিবন্ধকরণ ফর্ম, যা ব্যবহারকারীদের মডেলের জন্য একটি ফর্ম, সংস্থার জন্য একটি স্ট্রিং মান গ্রহণ করে। তবে, আমি সবেমাত্র এমন একটি পরিবর্তন করেছি যাতে ব্যবহারকারীরা_ সংস্থাগুলির অন্তর্ভুক্ত। অতএব, আমাকে কোম্পানির একটি অবজেক্ট ব্যবহারকারীদের মডেলটিতে প্রেরণ করা দরকার।

আমি কোম্পানীর কোনও অবজেক্টটি পেতে ফর্ম থেকে স্ট্রিংয়ের মানটি ব্যবহার করতে চাই:

@user.company = Company.find_by_name(params[:company])

আমি বিশ্বাস করি যে উপরের কাজগুলি, তবে ফর্মটি: সংস্থাকে (যা স্ট্রিং করছে) মডেলটিতে ছাড়ছে যখন আমি ফোন করব:

@user = User.new(params[:user])

অতএব, আমি জানতে চাই: (এবং কীভাবে তা খুঁজে পাচ্ছি না): ব্যবহারকারী মডেলটিতে যাওয়ার আগে কোম্পানী: পরম সরিয়ে ফেলতে।

উত্তর:


209

4/5 রেলগুলি - সম্পাদিত উত্তর (মন্তব্য দেখুন)

যেহেতু এই প্রশ্নটি রেলের নতুন সংস্করণগুলি রচনা হিসাবে যুক্ত করা হয়েছে ! এবং যেমন বাদে :

new_params = params.except[the one I wish to remove]

আপনার প্রয়োজনীয় সমস্ত প্যারামগুলিকে একটি অনুলিপিটিতে 'ধরার' একটি নিরাপদ উপায় যা পরমগুলিতে পাস হওয়া আসলটি ধ্বংস না করে (যা আপনার কোডটি সময়ের সাথে সাথে ডিবাগিং এবং রক্ষণাবেক্ষণের কাজটি করায় এটি করা ভাল নয়)।

অথবা আপনি সরাসরি অনুলিপি ছাড়াই সরাসরি পাস করতে পারেন:

@person.update(params[:person].except(:admin))

extract!(! ঠুং অপারেটর আছে) যাতে আরও বেশি যত্নের সাথে ব্যবহার মূল পরিবর্তন হবে!

আসল উত্তর

আপনি এটি ব্যবহার করে কোনও হ্যাশ থেকে একটি কী / মান জুড়িটি সরিয়ে ফেলতে পারেন Hash#delete:

params.delete :company

যদি এটি প্যারামগুলিতে থাকে [: ব্যবহারকারী], তবে আপনি এটি ব্যবহার করতে পারেন:

params[:user].delete :company

16
আমি রেল 4.0 ব্যবহার করছি, এবং model_params.delete :key_nameকাজ করছে না - কোনও ধারণা কেন?
জোড়ায়ার

13
পরম হ্যাশ থেকে মুছে ফেলা খুব খারাপ আইডিএএ। বিভ্রান্ত মানুষ সহজে ডিবাগিং ইত্যাদি সময় ... আপনি বরাদ্দ বৈশিষ্ট্যাবলী যেমন ব্যবহার পাস একটি কাস্টম হ্যাশ ব্যবহার assin_params = params.dup.delete(:company)। কখনই সরাসরি
প্যারামগুলি

4
আমি বলতে assign_params = params.dup; assign_params.delete(:company)
চাইছি

12
@ জোরেয়ার আমারও একই সমস্যা ছিল। আমার জন্য এটি ছিল কারণ আমার model_paramsএকটি ফাংশন ছিল যা প্রাসঙ্গিক প্যারামগুলি থেকে এনেছিল params। সুতরাং আপনি যখন deleteথেকে model_paramsআসলেই model_paramsফিরে আসবে এমন হ্যাশ থেকে মুছে ফেলছেন।
লুসি বাইন

1
ব্যবহারকারীর_প্রেমগুলি একটি পদ্ধতি, সুতরাং যখন আপনি ব্যবহারকারীর_প্রেমস.ডিলেট (: this_param) করেন, এটি ডান হ্যাশ গণনা করে তবে ব্যবহারকারী_প্যারামগুলিতে পরবর্তী কোনও কল স্ক্র্যাচ থেকে হ্যাশটির পুনঃসংযোগ করবে। এই কারণেই @ গাউল বলেছেন এটি একটি খারাপ ধারণা। 5 রেলগুলিতে এখন আপনার কাছে প্যারাম রয়েছে ex বাদে পদ্ধতি এবং এক্সট্রাক্টও!
আরএমসিচারি

89

আপনার সম্ভবত হ্যাশ.এসসিপ্ট ব্যবহার করা উচিত

class MyController < ApplicationController
  def explore_session_params
    params[:explore_session].except(:account_id, :creator)
  end
end

এটি 2 টি জিনিস সম্পাদন করে: আপনাকে একবারে 1 টিরও বেশি কী বাদ দিতে দেয় এবং আসল হ্যাশটি সংশোধন করে না।


রেলস 4 অ্যাকশনকন্ট্রোলার :: প্যারামিটারগুলি উত্তরাধিকার সূত্রে হ্যাশ পেয়েছে, তাই বাদে বা নিষ্কাশন করা! কাজ করবে, 5 রেলগুলিতে, এটি বাদ এবং নিষ্কাশন করেছে!
অ্যাকশনকন্ট্রোলারে

আমার কাছে আপডেটের পদ্ধতিতে এই হ্যাশ প্যারাম রয়েছে। "-1"কী হিসাবে কী আছে তার বাদে আমি কীভাবে পারি । ut "utf8" => "✓", "_ স্মৃতি" => "প্যাচ", "সত্যতা_ টোকেন" => "ভিটিওয়াই ...", "ব্রোশিওর" => title "শিরোনাম" => "হ্যালো ওয়ার্ল্ড", "প্রোফাইলেজ_অ্যাট্রিবিউটস" => {"-1" => {"সদস্য_প্রোফাইল_আইডি" => "3"}, "0" => percentage "শতাংশ" => "10.0", "বিবরণ" => "কিছু বিবরণ!", "_স্ট্রোয়" = > "মিথ্যা", "আইডি" => "10"}, "1" => {...}}, "স্পনসরিং_অ্যাট্রিবিউটস" => {"-1" => sp "স্পনসর_আইডি" => "2"}, "0" => { "brochure_id" => "

2

এটি অর্জনের সঠিক উপায়টি হ'ল ব্যবহার করা strong_params

class UsersController < ApplicationController
  def create
    @user = User.new(user_params)
  end

  private

  def user_params
    params.require(:user).permit(:name, :age)
  end
end

কোন প্যারামগুলিকে মডেলটিতে পাঠানো উচিত তার উপর আপনার আরও নিয়ন্ত্রণ রয়েছে


1
respond_to do |format|
  if params[:company].present?
    format.html { redirect_to(:controller => :shopping, :action => :index) }
  else
    format.html
  end
end

এটি url থেকে প্যারামগুলি সরিয়ে ফেলবে


0

মুছতে সক্ষম হওয়ার জন্য আপনি একটি মেমো করতে পারেন :

def parameters
  @parameters ||= params.require(:root).permit(:foo, :bar)
end

এখন আপনি এটি করতে পারেন:

parameteres.delete(:bar)
parameters
=> <ActionController::Parameters {"foo" => "foo"} permitted: true>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.