Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fix autosave association to skip validation if it is marked for destr…

…uction. [#2064 state:resolved]

Signed-off-by: Eloy Duran <eloy.de.enige@gmail.com>
  • Loading branch information...
commit 845f62f4730fb9ab8847033f9ab7435c40006662 1 parent 6cc0b96
Dmitry Polushkin authored alloy committed
View
12 activerecord/lib/active_record/autosave_association.rb
@@ -243,17 +243,15 @@ def validate_collection_association(reflection)
# Returns whether or not the association is valid and applies any errors to
# the parent, <tt>self</tt>, if it wasn't. Skips any <tt>:autosave</tt>
- # enabled records if they're marked_for_destruction?.
+ # enabled records if they're marked_for_destruction? or destroyed.
def association_valid?(reflection, association)
- return true if association.destroyed?
+ return true if association.destroyed? || association.marked_for_destruction?
unless valid = association.valid?
if reflection.options[:autosave]
- unless association.marked_for_destruction?
- association.errors.each do |attribute, message|
- attribute = "#{reflection.name}_#{attribute}"
- errors[attribute] << message if errors[attribute].empty?
- end
+ association.errors.each do |attribute, message|
+ attribute = "#{reflection.name}_#{attribute}"
+ errors[attribute] << message if errors[attribute].empty?
end
else
errors.add(reflection.name)
View
7 activerecord/test/cases/autosave_association_test.rb
@@ -544,6 +544,7 @@ def test_should_skip_validation_on_a_child_association_if_marked_for_destruction
assert !@pirate.valid?
@pirate.ship.mark_for_destruction
+ @pirate.ship.expects(:valid?).never
assert_difference('Ship.count', -1) { @pirate.save! }
end
@@ -581,6 +582,7 @@ def test_should_skip_validation_on_a_parent_association_if_marked_for_destructio
assert !@ship.valid?
@ship.pirate.mark_for_destruction
+ @ship.pirate.expects(:valid?).never
assert_difference('Pirate.count', -1) { @ship.save! }
end
@@ -624,7 +626,10 @@ def save(*args)
children.each { |child| child.name = '' }
assert !@pirate.valid?
- children.each { |child| child.mark_for_destruction }
+ children.each do |child|
+ child.mark_for_destruction
+ child.expects(:valid?).never
+ end
assert_difference("#{association_name.classify}.count", -2) { @pirate.save! }
end
Please sign in to comment.
Something went wrong with that request. Please try again.