ri > ActiveModel::Dirty

= 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

ActiveModel::Dirty
ActiveModel::Dirty Includes: Extended by:
Active Model Dirty
Instance methods:

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)
Valid XHTML 1.0 Transitional!Valid CSS!

^_top_^