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_updatellamada:after_update :send_notification_after_change, if: -> { published_changed? }saved_change_to_published?osaved_change_to_publishedbuscar el cambio durante la devolución de llamadaPara aquellos que desean conocer los cambios que se acaban de realizar en una
after_savedevolució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_savedevolución de llamada,self.changed?estrueyself.attribute_name_changed?es tambiéntrue, peroself.previous_changesdevuelve un hash vacío.saved_changesenafter_savedevoluciones 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_changepara 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_attributeque regresa["old", "new"]. o usesaved_changes, que devuelve todos los cambios, y se puede acceder a ellos comosaved_changes['attribute'].fuente
attribute_wasmétodos: usesaved_change_to_attributeen su lugar.En caso de que pueda hacer esto en
before_savelugar 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_saveself.changedse puede usar enafter_savedevoluciones de llamada.self.changedes 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_updategancho, solo en elbefore_updategancho. Pude hacer que funcionara con elaround_updategancho (¿nuevo?) :fuente
puede agregar una condición
after_updatesimilar para que así:no es necesario agregar una condición dentro del
send_notificationmétodo mismo.fuente
Simplemente agrega un descriptor de acceso que define lo que cambia
fuente