Estoy configurando una devolución de llamada after_save en mi observador modelo para enviar una notificación solo si el atributo publicado del modelo se cambió de falso a verdadero. ¿Desde métodos como los cambiados? solo son útiles antes de guardar el modelo, la forma en que actualmente (y sin éxito) intento hacerlo es la siguiente:
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
¿Alguien tiene alguna sugerencia sobre la mejor manera de manejar esto, preferiblemente usando devoluciones de llamada de observador modelo (para no contaminar mi código de controlador)?
fuente
after_update
llamada:after_update :send_notification_after_change, if: -> { published_changed? }
saved_change_to_published?
osaved_change_to_published
buscar el cambio durante la devolución de llamadaPara aquellos que desean conocer los cambios que se acaban de realizar en una
after_save
devolución de llamada:Rieles 5.1 y superiores
Rieles <5.1
Ver también: http://api.rubyonrails.org/classes/ActiveModel/Dirty.html#method-i-previous_changes
fuente
after_save
devolución de llamada,self.changed?
estrue
yself.attribute_name_changed?
es tambiéntrue
, peroself.previous_changes
devuelve un hash vacío.saved_changes
enafter_save
devoluciones de llamada en su lugarPara cualquiera que vea esto más adelante, ya que actualmente (agosto de 2017) encabeza Google: Vale la pena mencionar que este comportamiento se alterará en Rails 5.2 y tiene advertencias de desaprobación a partir de Rails 5.1, ya que ActiveModel :: Dirty cambió un poco .
Que cambio?
Si está utilizando el
attribute_changed?
método enafter_*
-callbacks, verá una advertencia como:Como se menciona, puede solucionar esto fácilmente reemplazando la función con
saved_change_to_attribute?
. Entonces, por ejemplo, sename_changed?
conviertesaved_change_to_name?
.Del mismo modo, si está utilizando el
attribute_change
para obtener los valores de antes y después, esto también cambia y arroja lo siguiente:Nuevamente, como se menciona, el método cambia el nombre al
saved_change_to_attribute
que regresa["old", "new"]
. o usesaved_changes
, que devuelve todos los cambios, y se puede acceder a ellos comosaved_changes['attribute']
.fuente
attribute_was
métodos: usesaved_change_to_attribute
en su lugar.En caso de que pueda hacer esto en
before_save
lugar deafter_save
, podrá usar esto:devuelve una matriz de todas las columnas modificadas en este registro.
también puedes usar:
que devuelve un hash de columnas que cambiaron y resultados anteriores y posteriores como matrices
fuente
after_
devolución de llamada, que es de lo que realmente se trataba la pregunta. La respuesta de @ jacek-głodek a continuación es la correcta.before_save
self.changed
se puede usar enafter_save
devoluciones de llamada.self.changed
es una serie de cadenas! (¡No símbolos!)["attr_name", "other_attr_name"]
La respuesta "seleccionada" no funcionó para mí. Estoy usando rails 3.1 con CouchRest :: Model (basado en Active Model). Los
_changed?
métodos no devuelven verdadero para los atributos modificados en elafter_update
gancho, solo en elbefore_update
gancho. Pude hacer que funcionara con elaround_update
gancho (¿nuevo?) :fuente
puede agregar una condición
after_update
similar para que así:no es necesario agregar una condición dentro del
send_notification
método mismo.fuente
Simplemente agrega un descriptor de acceso que define lo que cambia
fuente