Saya sering menemukan diri saya menulis ini:
params.delete(:controller)
params.delete(:action)
params.delete(:other_key)
redirect_to my_path(params)
Jejak penghapusan tidak terasa benar dan tidak juga:
[:controller, :action, :other_key].each do |k|
params.delete(k)
end
Adakah yang lebih sederhana dan lebih bersih?
ruby-on-rails
ruby
Mark Westling
sumber
sumber
Hash#except!
tetapiHash#except
adalah cara untuk pergi (jangan main-main denganparams
!). Sebagai aturan praktis, jangan main-main dengan objek apa pun di tempat kecuali benar-benar diperlukan, efek samping mungkin memiliki hasil yang tidak terduga.Jawaban:
Saya kira Anda tidak mengetahui Hash # kecuali metode ActiveSupport menambah Hash.
Ini akan memungkinkan kode Anda disederhanakan menjadi:
Juga, Anda tidak perlu menambal monyet, karena tim Rails melakukannya untuk Anda!
sumber
except!
benar. Rails 3.0User.attributes.except("id", "created_at", "updated_at")
simbol tidak bekerjaattributes
metode ActiveRecord mengembalikanHash
kunci denganString
. Jadi, Anda harus menggunakan nama kunci string di.except()
. Namun saya menyiasati ini menggunakanHash.symbolize_keys
a@user.attributes.symbolize_keys.except(:password, :notes)
- menggunakansymbolize_keys
membuatnya berfungsi seperti yang diharapkanSaat menggunakan
Hash#except
menangani masalah Anda, ketahuilah bahwa masalah tersebut berpotensi menimbulkan masalah keamanan . Aturan praktis yang baik untuk menangani data dari pengunjung adalah menggunakan pendekatan daftar putih. Dalam hal ini, gunakanHash#slice
saja.sumber
{:b=>2, :c=>3}:Hash
Saya akan sangat senang dengan kode yang semula Anda posting di pertanyaan Anda.
sumber
Hash
ini adalah jawaban terbaik: +1:Cara lain untuk frase jawaban dmathieu mungkin
sumber
Jalankan patch monyet?
sumber
delete(k)
bukandelete(key)
delete_keys
harus sederhanadup.delete_keys!(*keys)
Saya tidak tahu apa yang Anda pikir salah dengan solusi yang Anda usulkan. Saya kira Anda ingin
delete_all
metode pada Hash atau sesuatu? Jika demikian, jawaban tadman memberikan solusi. Tapi terus terang, untuk sekali saja, saya pikir solusi Anda sangat mudah diikuti. Jika Anda sering menggunakan ini, Anda mungkin ingin membungkusnya dengan metode pembantu.sumber