= ActiveModel::Dirty ------------------------------------------------------------------------ = Includes: ActiveModel::AttributeMethods (from /home/chedong/.local/share/rdoc) ------------------------------------------------------------------------ = Extended by: ActiveSupport::Concern (from /home/chedong/.local/share/rdoc) (from /home/chedong/.local/share/rdoc) ------------------------------------------------------------------------ == Active Model Dirty Provides a way to track changes in your object in the same way as Active Record does. The requirements for implementing ActiveModel::Dirty are: * include ActiveModel::Dirty in your object. * Call define_attribute_methods passing each method you want to track. * Call [attr_name]_will_change! before each change to the tracked attribute. * Call changes_applied after the changes are persisted. * Call clear_changes_information when you want to reset the changes information. * Call restore_attributes when you want to restore previous data. A minimal implementation could be: class Person include ActiveModel::Dirty define_attribute_methods :name def initialize @name = nil end def name @name end def name=(val) name_will_change! unless val == @name @name = val end def save # do persistence work changes_applied end def reload! # get the values from the persistence layer clear_changes_information end def rollback! restore_attributes end end A newly instantiated Person object is unchanged: person = Person.new person.changed? # => false Change the name: person.name = 'Bob' person.changed? # => true person.name_changed? # => true person.name_changed?(from: nil, to: "Bob") # => true person.name_was # => nil person.name_change # => [nil, "Bob"] person.name = 'Bill' person.name_change # => [nil, "Bill"] Save the changes: person.save person.changed? # => false person.name_changed? # => false Reset the changes: person.previous_changes # => {"name" => [nil, "Bill"]} person.name_previously_changed? # => true person.name_previously_changed?(from: nil, to: "Bill") # => true person.name_previous_change # => [nil, "Bill"] person.name_previously_was # => nil person.reload! person.previous_changes # => {} Rollback the changes: person.name = "Uncle Bob" person.rollback! person.name # => "Bill" person.name_changed? # => false Assigning the same value leaves the attribute unchanged: person.name = 'Bill' person.name_changed? # => false person.name_change # => nil Which attributes have changed? person.name = 'Bob' person.changed # => ["name"] person.changes # => {"name" => ["Bill", "Bob"]} If an attribute is modified in-place then make use of [attribute_name]_will_change! to mark that the attribute is changing. Otherwise Active Model can't track changes to in-place attributes. Note that Active Record can detect in-place modifications automatically. You do not need to call [attribute_name]_will_change! on Active Record models. person.name_will_change! person.name_change # => ["Bill", "Bill"] person.name << 'y' person.name_change # => ["Bill", "Billy"] ------------------------------------------------------------------------ = Instance methods: changed changed? changed_attributes changes changes_applied clear_attribute_changes clear_changes_information previous_changes restore_attributes
Generated by phpman v4.9.26-1-g511901d · Markdown · JSON · MCP Author: Che Dong Under GNU General Public License
2026-07-27 16:42 @216.73.216.194
CrawledBy Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)