রিলে অন রুবি: একাধিক হ্যাশ কী মুছুন


148

আমি প্রায়শই নিজেকে এই লিখতে দেখি:

params.delete(:controller)  
params.delete(:action)  
params.delete(:other_key)  
redirect_to my_path(params)  

মোছার পথটি সঠিক মনে হয় না এবং হয় না:

[:controller, :action, :other_key].each do |k|
  params.delete(k)
end

সহজ এবং পরিষ্কার কিছু আছে কি?


যখন আমি লিখেছিলাম যে দ্বিতীয় পদ্ধতির সঠিক অনুভূত হয়নি, আমার অর্থ হ্যাশ এপিআইয়ের সমৃদ্ধি দেওয়া হয়েছিল, আমি সন্দেহ করেছিলাম যে এর জন্য ইতিমধ্যে কিছু পদ্ধতি বা রীতিমতো আছে এবং একটি বানরের প্যাচ প্রয়োজন হবে না। যদিও, না। যারা উত্তর দিয়েছেন তাদের সবাইকে অনেক ধন্যবাদ!
মার্ক ওয়েস্টলিং

3
হ্যাশ # ব্যতীত আমি ঠিক যা খুঁজছিলাম was আমি মনে করি না যে এটি একটি রেল কোর এক্সটেনশন তাই হ্যাশ এপিআই-তে এটি খুঁজে না পেয়ে আমি হতবাক হয়ে গিয়েছিলাম।
মার্ক ওয়েস্টলিং

1
মনে রাখবেন যে কঠোরভাবে উত্তরটি Hash#except!তবে Hash#exceptএটিই যাওয়ার উপায় (এতে গণ্ডগোল করবেন না params!)। থাম্বের নিয়ম হিসাবে, একেবারে প্রয়োজন না হলে কোনও স্থানে জায়গা নিয়ে গণ্ডগোল করবেন না, পার্শ্ব-প্রতিক্রিয়াগুলি অপ্রত্যাশিত ফলাফল হতে পারে।
টোকল্যান্ড

উত্তর:


219

অ্যাক্টিভসপোর্টটি হ্যাশটিতে যোগ করা পদ্ধতি ব্যতীত আমি অনুমান করছি যে আপনি হ্যাশ # সম্পর্কে অজানা ।

এটি আপনার কোডটিকে সরল করার অনুমতি দেবে:

redirect_to my_path(params.except(:controller, :action, :other_key))

এছাড়াও, আপনাকে বানরের প্যাচও লাগবে না, যেহেতু রেল দলটি এটি আপনার জন্য করেছে!


1
আহ্, আমি জানতাম আমি এটি আগে দেখেছি কিন্তু আমি মনে করতে পারি না কোথায়! (সুতরাং আমার "এটি সঠিক মনে হয় না" মন্তব্য।) ধন্যবাদ!
মার্ক ওয়েস্টলিং

3
সেই কম ডকুমেন্টেড পদ্ধতিগুলির মধ্যে একটি। আমি উত্তর প্রস্তাব করার সময় এই জাতীয় কিছু সন্ধান করতে গিয়েছিলাম কিন্তু এটি দেখতে পাইনি।
tadman

1
কিছু কারণে কাজ না করে। কিন্তু except!করেছেন। রেল 3.0
ট্রিপ

4
অ্যাক্টিভেকর্ড বৈশিষ্ট্যগুলিতে 3.2 রেলগুলি কীগুলির জন্য স্ট্রিং ব্যবহার করতে হবে? অর্থাত্ User.attributes.except("id", "created_at", "updated_at")প্রতীকগুলি কার্যকর হয়নি
ঘর 9

1
@ হাউস 9 উল্লিখিত কীটিতে যুক্ত করে, অ্যাক্টিভেকর্ড attributesপদ্ধতিটি Hashকীগুলির সাথে একটি ফেরত দেয় String। সুতরাং আপনি স্ট্রিং কী নাম ব্যবহার করতে হবে .except()। তবে আমি Hash.symbolize_keysলা ব্যবহার করে এটি প্রায় পেয়েছি @user.attributes.symbolize_keys.except(:password, :notes)- symbolize_keysএটি ব্যবহারের ফলে এটি প্রত্যাশার সাথে কাজ করে
ফায়ারড্রাগন

44

Hash#exceptআপনার সমস্যাটি পরিচালনা করার সময় , সচেতন থাকুন এটি সম্ভাব্য সুরক্ষা সমস্যাগুলি প্রবর্তন করে । দর্শকদের কাছ থেকে যে কোনও ডেটা পরিচালনা করার জন্য থাম্বের একটি ভাল নিয়ম হ'ল একটি শ্বেতলিস্ট পদ্ধতির ব্যবহার। এই ক্ষেত্রে, Hash#sliceপরিবর্তে ব্যবহার করে।

params.slice!(:param_to_remove_1, :param_to_remove_2)
redirect_to my_path(params)

1
পুনঃনির্দেশের আশেপাশে সুরক্ষার সমস্যাগুলি উল্লেখ করার জন্য ধন্যবাদ।
ডেভিড জে

12
কেবলমাত্র শীর্ষস্থানীয়: অ্যাক্টিভসপোর্ট, রুবি নিজেই নয়, হ্যাশ # স্লাইস এবং # স্লাইস সরবরাহ করে! as.rubyonrails.org/class/ActtiveSupport/CoreExtionss/Hash/…
ডেভিড জে

1
আমি ডেভিড জেমসের লিঙ্কটি কাজ করতে পারি না তবে এটি একদম
ডোমিনিক

অপরিজ্ঞাত পদ্ধতিতে 'স্লাইস!' জন্য{:b=>2, :c=>3}:Hash
খুররম রাজা

25

আপনি আপনার প্রশ্নে মূলত পোস্ট করা কোডটি দিয়ে আমি পুরোপুরি খুশি হব।

[:controller, :action, :other_key].each { |k| params.delete(k) }

পরিবর্তন না করেই Hashসেরা উত্তর: +1:
ড্যান ব্র্যাডবেরি

আমি এই পদ্ধতিটি ব্যবহার করেছি তবে হ্যাশটির নামের সাথে প্যারামগুলি প্রতিস্থাপন করেছি এবং এটি কার্যকর হয়েছে !! হ্যাশটি রূপান্তরিত হয়।
পাবলো


8

একটি বানর প্যাচ আগুন?

class Hash
  def delete_keys!(*keys)
    keys.flatten.each do |k|
      delete(k)
    end

    self
  end

  def delete_keys(*keys)
    _dup = dup
    keys.flatten.each do |k|
      _dup.delete(k)
    end

    _dup
  end
end

5
বানর প্যাচগুলি সর্বশেষ অবলম্বনের একটি সরঞ্জাম।
বব আমান

15
বিদ্যমান ফাংশনগুলি প্রতিস্থাপন করে এমন বানর প্যাচগুলি সর্বশেষ অবলম্বনের একটি সরঞ্জাম। বানরের প্যাচগুলি যা নতুন ফাংশন যুক্ত করে তা
হ'ল

4
এর delete(k)পরিবর্তে হওয়া উচিতdelete(key)
ভিনসেন্ট

কোড রক্ষণাবেক্ষণের জন্য অ-ধ্বংসাত্মক বাস্তবায়ন delete_keysসহজভাবে হওয়া উচিতdup.delete_keys!(*keys)
ফ্রোগজ

@ ফ্রোগজ অন্যটির নিরিখে একজনকে সংজ্ঞায়িত করা সবসময় একটি খারাপ ধারণা নয়, তবে স্পষ্টতার জন্য এখানে কেবল খণ্ডনবিহীন রেখে দেওয়া হয়েছে।
tadman

2

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

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