Dans les models rubyonrails il existe une tripotée de méthodes pour les attributs. Vous pouvez avoir un aperçu de ces méthodes dans le module ActiveRecord::Dirty (https://ar.rubyonrails.org/classes/ActiveRecord/Dirty.html)
Voici la traduction en français de la doc RoR :
Détecter les changements des attributs non-sauvegardés.
Un nouvel objet instantié est inchangé :
person = Person.find_by_name('uncle bob') person.changed? # => false
Changeons le nom :
person.name = 'Bob' person.changed? # => true person.name_changed? # => true person.name_was # => 'uncle bob' person.name_change # => ['uncle bob', 'Bob'] person.name = 'Bill' person.name_change # => ['uncle bob', 'Bill']
En sauvegardant les changements :
person.save person.changed? # => false person.name_changed? # => false
En assignant de nouveau l'ancienne valeur l'attribut est inchangé:
person.name = 'Bill' person.name_changed? # => false person.name_change # => nil
Quels sont les attributs qui ont changé ?
person.name = 'bob' person.changed # => ['name'] person.changes # => { 'name' => ['Bill', 'bob'] }
Avant de modifier sur place :
person.name_will_change! person.name << 'by' person.name_change # => ['uncle bob', 'uncle bobby']
Pratique lors des callbacks (before_save, after_save, before_create, ...) pour faire des logs en base de données ou autres.