Я пытаюсь использовать ActiveModel :: Dirty / ActiveRecord :: AttributeMethods :: Dirty в представлениях (например, в update.js.erb) следующим образом:
<% if @product.saved_change_to_attribute?(:name) %>
alert("Name changed!")
<% end %>
В моем контроллере у меня есть:
class ProductsController < ApplicationController
def update
@product = Product.find(params[:id])
respond_to do |format|
if @product.update(product_params)
format.js { render(:action => :show) }
else
format.js { render(:action => :update) }
end
end
end
private
def product_params
params.require(:product).permit(:price)
end
end
В моей модели: 1011 *
class Product < ApplicationRecord
after_update :something_that_clears_changed_attributes
private
def something_that_clears_changed_attributes
...
self.reload
end
end
В приведенном выше примере alert("Name changed!")
никогда не будет запущен.
На самом деле, кажется, что если во время «потока обновлений» (в контроллере) возникают «обратные вызовы» (на уровне модели), то перезагружает объект или его дальнейшее обновление или сохранение, тогда Вы не можете больше полагаться на Грязный. То есть грязные методы могут возвращать «неожиданные» значения, поскольку объектом «манипулируют» во время потока.
Это относится к моделям, которые используют гемы, которые повторно загружают, обновляют или сохраняют объект несколько раз в обратных вызовах и, таким образом, «делают недействительными» модель Dirty во время потока (даже метод attribute_before_last_save
в Rails 5 возвращались бы «неожиданные» значения).
Чтобы решить эту проблему, вы можете использовать первый пример в этом посте (сохраняя - до обновления - изменение атрибутов в переменной для последующего использования), но, возможно, есть лучший способ использовать грязные модели.
Есть идеи о том, как положиться на грязные модели, когда во время потока происходит многократная перезагрузка, обновление, сохранение или другие операции, которые очищают измененные атрибуты?