Saya menyiapkan callback after_save di pengamat model saya untuk mengirim pemberitahuan hanya jika atribut model yang diterbitkan diubah dari false menjadi true. Karena metode seperti diubah? hanya berguna sebelum model disimpan, cara saya saat ini (dan tidak berhasil) mencoba melakukannya adalah sebagai berikut:
def before_save(blog)
@og_published = blog.published?
end
def after_save(blog)
if @og_published == false and blog.published? == true
Notification.send(...)
end
end
Apakah ada yang punya saran tentang cara terbaik untuk menangani ini, lebih disukai menggunakan model pengamat panggilan balik (agar tidak mencemari kode pengontrol saya)?
sumber
after_update
panggilan:after_update :send_notification_after_change, if: -> { published_changed? }
saved_change_to_published?
atausaved_change_to_published
mengambil perubahan selama panggilan balikBagi mereka yang ingin mengetahui perubahan yang baru saja dilakukan dalam
after_save
panggilan balik:Rails 5.1 dan lebih besar
Rel <5.1
Lihat juga: http://api.rubyonrails.org/classes/ActiveModel/Dirty.html#method-i-previous_changes
sumber
after_save
panggilan balik,self.changed?
adalahtrue
danself.attribute_name_changed?
jugatrue
, tetapiself.previous_changes
mengembalikan hash kosong.saved_changes
dalamafter_save
panggilan balikBagi siapa pun yang melihat ini nanti, seperti saat ini (Agustus 2017) teratas di google: Perlu disebutkan, bahwa perilaku ini akan diubah dalam Rails 5.2 , dan memiliki peringatan penghentian pada Rails 5.1, seperti ActiveModel :: Dirty berubah sedikit .
Apa yang saya ubah?
Jika Anda menggunakan
attribute_changed?
metode diafter_*
-callbacks, Anda akan melihat peringatan seperti:Seperti yang disebutkan, Anda dapat memperbaikinya dengan mudah dengan mengganti fungsinya
saved_change_to_attribute?
. Jadi misalnya,name_changed?
menjadisaved_change_to_name?
.Demikian juga, jika Anda menggunakan
attribute_change
untuk mendapatkan nilai sebelum-sesudah, ini juga berubah dan melempar yang berikut:Sekali lagi, seperti yang disebutkan, metode ini mengubah nama
saved_change_to_attribute
yang kembali["old", "new"]
. atau gunakansaved_changes
, yang mengembalikan semua perubahan, dan ini dapat diakses sebagaisaved_changes['attribute']
.sumber
attribute_was
metode: gunakansaved_change_to_attribute
saja.Jika Anda bisa melakukan ini,
before_save
bukanafter_save
, Anda akan dapat menggunakan ini:itu mengembalikan array dari semua kolom yang diubah dalam catatan ini.
Anda juga bisa menggunakan:
yang mengembalikan hash kolom yang berubah dan sebelum dan sesudah hasil sebagai array
sumber
after_
panggilan balik, yang merupakan pertanyaan sebenarnya. @ jacek-głodek jawaban di bawah ini adalah yang benar.before_save
self.changed
dapat digunakan dalamafter_save
panggilan balik.self.changed
adalah array string! (Bukan simbol!)["attr_name", "other_attr_name"]
Jawaban "terpilih" tidak berhasil untuk saya. Saya menggunakan rel 3.1 dengan CouchRest :: Model (berdasarkan Model Aktif). The
_changed?
metode tidak kembali berlaku untuk atribut berubah diafter_update
hook, hanya dibefore_update
kait. Saya bisa membuatnya bekerja menggunakanaround_update
kait (baru?) :sumber
Anda dapat menambahkan kondisi
after_update
seperti ini:tidak perlu menambahkan kondisi dalam
send_notification
metode itu sendiri.sumber
Anda hanya menambahkan accessor yang menentukan apa yang Anda ubah
sumber