mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Dirty: treat two changes resulting in the original value as being unchanged.
[#798 state:resolved] Signed-off-by: Jeremy Kemper <jeremy@bitsweat.net>
This commit is contained in:
parent
f277e1d8fd
commit
ad562c58ea
2 changed files with 40 additions and 1 deletions
|
@ -123,7 +123,10 @@ module ActiveRecord
|
||||||
attr = attr.to_s
|
attr = attr.to_s
|
||||||
|
|
||||||
# The attribute already has an unsaved change.
|
# The attribute already has an unsaved change.
|
||||||
unless changed_attributes.include?(attr)
|
if changed_attributes.include?(attr)
|
||||||
|
old = changed_attributes[attr]
|
||||||
|
changed_attributes.delete(attr) unless field_changed?(attr, old, value)
|
||||||
|
else
|
||||||
old = clone_attribute_value(:read_attribute, attr)
|
old = clone_attribute_value(:read_attribute, attr)
|
||||||
changed_attributes[attr] = old if field_changed?(attr, old, value)
|
changed_attributes[attr] = old if field_changed?(attr, old, value)
|
||||||
end
|
end
|
||||||
|
|
|
@ -191,6 +191,42 @@ class DirtyTest < ActiveRecord::TestCase
|
||||||
assert !pirate.changed?
|
assert !pirate.changed?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_reverted_changes_are_not_dirty
|
||||||
|
phrase = "shiver me timbers"
|
||||||
|
pirate = Pirate.create!(:catchphrase => phrase)
|
||||||
|
pirate.catchphrase = "*hic*"
|
||||||
|
assert pirate.changed?
|
||||||
|
pirate.catchphrase = phrase
|
||||||
|
assert !pirate.changed?
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_reverted_changes_are_not_dirty_after_multiple_changes
|
||||||
|
phrase = "shiver me timbers"
|
||||||
|
pirate = Pirate.create!(:catchphrase => phrase)
|
||||||
|
10.times do |i|
|
||||||
|
pirate.catchphrase = "*hic*" * i
|
||||||
|
assert pirate.changed?
|
||||||
|
end
|
||||||
|
assert pirate.changed?
|
||||||
|
pirate.catchphrase = phrase
|
||||||
|
assert !pirate.changed?
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
def test_reverted_changes_are_not_dirty_going_from_nil_to_value_and_back
|
||||||
|
pirate = Pirate.create!(:catchphrase => "Yar!")
|
||||||
|
|
||||||
|
pirate.parrot_id = 1
|
||||||
|
assert pirate.changed?
|
||||||
|
assert pirate.parrot_id_changed?
|
||||||
|
assert !pirate.catchphrase_changed?
|
||||||
|
|
||||||
|
pirate.parrot_id = nil
|
||||||
|
assert !pirate.changed?
|
||||||
|
assert !pirate.parrot_id_changed?
|
||||||
|
assert !pirate.catchphrase_changed?
|
||||||
|
end
|
||||||
|
|
||||||
def test_save_should_store_serialized_attributes_even_with_partial_updates
|
def test_save_should_store_serialized_attributes_even_with_partial_updates
|
||||||
with_partial_updates(Topic) do
|
with_partial_updates(Topic) do
|
||||||
topic = Topic.create!(:content => {:a => "a"})
|
topic = Topic.create!(:content => {:a => "a"})
|
||||||
|
|
Loading…
Reference in a new issue