La respuesta de cwninja debería hacer el truco, pero hay un poco más.
En primer lugar, el manejo de los atributos de base se realiza con el método write_attribute, por lo que debe aprovechar esta opción.
Rails también tiene una estructura de devolución de llamada incorporada que podría ser útil si bien no permite pasar argumentos, lo cual es un poco molesto.
Uso de devoluciones de llamada personalizados que podrían hacerlo de esta manera:
class Person < ActiveRecord::Base
def write_attribute(attr_name, value)
attribute_changed(attr_name, read_attribute(attr_name), value)
super
end
private
def attribute_changed(attr, old_val, new_val)
logger.info "Attribute Changed: #{attr} from #{old_val} to #{new_val}"
end
end
Si quisiera tratar de utilizar Rails devoluciones de llamada (especialmente útil si usted podría tener múltiples devoluciones de llamada y/o subclases) que podría hacer algo como esto :
class Person < ActiveRecord::Base
define_callbacks :attribute_changed
attribute_changed :notify_of_attribute_change
def write_attribute(attr_name, value)
returning(super) do
@last_changed_attr = attr_name
run_callbacks(:attribute_changed)
end
end
private
def notify_of_attribute_change
attr = @last_changed_attr
old_val, new_val = send("#{attr}_change")
logger.info "Attribute Changed: #{attr} from #{old_val} to #{new_val}"
end
end
Peter, eso es hermoso, va a ahorrarme un TONELADA de "write_attribute". He ensuciado todo mi código. ¡Gracias! – BushyMark
Parece que esto es solo para Rails 2. – lulalala
Llegó a este a través de google sin fecha de verificación. Este tutorial más reciente hizo lo que necesitaba: [Cómo controlar los cambios de un modelo en un 'after_callbacks'] (http://ruby-journal.com/how-to-track-changes-with-after-callbacks-in- rails-3-o-newer /) – Jay