Bagi 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 di after_*-callbacks, Anda akan melihat peringatan seperti:
PERINGATAN DEPRECASI: Perilaku attribute_changed?dalam setelah panggilan balik akan berubah di versi Rails berikutnya. Nilai pengembalian baru akan mencerminkan perilaku memanggil metode setelahsave kembali (misalnya kebalikan dari apa yang dikembalikan sekarang). Untuk mempertahankan perilaku saat ini, gunakan saved_change_to_attribute?saja. (dipanggil dari some_callback di /PATH_TO/app/models/user.rb:15)
Seperti yang disebutkan, Anda dapat memperbaikinya dengan mudah dengan mengganti fungsinya saved_change_to_attribute? . Jadi misalnya, name_changed?menjadi saved_change_to_name?.
Demikian juga, jika Anda menggunakan attribute_change untuk mendapatkan nilai sebelum-sesudah, ini juga berubah dan melempar yang berikut:
PERINGATAN DEPRECASI: Perilaku attribute_changedalam setelah panggilan balik akan berubah di versi Rails berikutnya. Nilai pengembalian baru akan mencerminkan perilaku memanggil metode setelahsave kembali (misalnya kebalikan dari apa yang dikembalikan sekarang). Untuk mempertahankan perilaku saat ini, gunakan saved_change_to_attributesaja. (dipanggil dari some_callback di /PATH_TO/app/models/user.rb:20)
Sekali lagi, seperti yang disebutkan, metode ini mengubah nama saved_change_to_attributeyang kembali ["old", "new"]. atau gunakan saved_changes, yang mengembalikan semua perubahan, dan ini dapat diakses sebagai saved_changes['attribute'].