mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #14861 from igor04/dirty-rollback
Added rollback method to ActiveModel::Dirty
This commit is contained in:
commit
bada1d3ed6
2 changed files with 35 additions and 0 deletions
|
@ -17,6 +17,7 @@ module ActiveModel
|
|||
# * Call <tt>changes_applied</tt> after the changes are persisted.
|
||||
# * Call <tt>reset_changes</tt> when you want to reset the changes
|
||||
# information.
|
||||
# * Call <tt>rollback_changes</tt> when you want to restore previous data
|
||||
#
|
||||
# A minimal implementation could be:
|
||||
#
|
||||
|
@ -42,6 +43,10 @@ module ActiveModel
|
|||
# def reload!
|
||||
# reset_changes
|
||||
# end
|
||||
#
|
||||
# def rollback!
|
||||
# rollback_changes
|
||||
# end
|
||||
# end
|
||||
#
|
||||
# A newly instantiated object is unchanged:
|
||||
|
@ -72,6 +77,13 @@ module ActiveModel
|
|||
# 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'
|
||||
|
@ -178,6 +190,11 @@ module ActiveModel
|
|||
@changed_attributes = ActiveSupport::HashWithIndifferentAccess.new
|
||||
end
|
||||
|
||||
# Restore all previous data
|
||||
def rollback_changes #:doc:
|
||||
changed_attributes.each_key { |attr| reset_attribute! attr }
|
||||
end
|
||||
|
||||
# Handle <tt>*_change</tt> for +method_missing+.
|
||||
def attribute_change(attr)
|
||||
[changed_attributes[attr], __send__(attr)] if attribute_changed?(attr)
|
||||
|
|
|
@ -45,6 +45,10 @@ class DirtyTest < ActiveModel::TestCase
|
|||
def reload
|
||||
reset_changes
|
||||
end
|
||||
|
||||
def rollback
|
||||
rollback_changes
|
||||
end
|
||||
end
|
||||
|
||||
setup do
|
||||
|
@ -176,4 +180,18 @@ class DirtyTest < ActiveModel::TestCase
|
|||
assert_equal ActiveSupport::HashWithIndifferentAccess.new, @model.previous_changes
|
||||
assert_equal ActiveSupport::HashWithIndifferentAccess.new, @model.changed_attributes
|
||||
end
|
||||
|
||||
test "rollback should restore all previous data" do
|
||||
@model.name = 'Dmitry'
|
||||
@model.color = 'Red'
|
||||
@model.save
|
||||
@model.name = 'Bob'
|
||||
@model.color = 'White'
|
||||
|
||||
@model.rollback
|
||||
|
||||
assert_not @model.changed?
|
||||
assert_equal 'Dmitry', @model.name
|
||||
assert_equal 'Red', @model.color
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue