mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
If a nested_attribute is being marked for destruction and at the same time an attr_accessor value is being assigned then the value being assigned is being ignored. This patch is a fix for that issue.
[#5939 state:resolved] Signed-off-by: José Valim <jose.valim@gmail.com>
This commit is contained in:
parent
18adbe9347
commit
66212f69ac
3 changed files with 24 additions and 6 deletions
|
@ -417,11 +417,8 @@ module ActiveRecord
|
||||||
# Updates a record with the +attributes+ or marks it for destruction if
|
# Updates a record with the +attributes+ or marks it for destruction if
|
||||||
# +allow_destroy+ is +true+ and has_destroy_flag? returns +true+.
|
# +allow_destroy+ is +true+ and has_destroy_flag? returns +true+.
|
||||||
def assign_to_or_mark_for_destruction(record, attributes, allow_destroy)
|
def assign_to_or_mark_for_destruction(record, attributes, allow_destroy)
|
||||||
if has_destroy_flag?(attributes) && allow_destroy
|
|
||||||
record.mark_for_destruction
|
|
||||||
else
|
|
||||||
record.attributes = attributes.except(*UNASSIGNABLE_KEYS)
|
record.attributes = attributes.except(*UNASSIGNABLE_KEYS)
|
||||||
end
|
record.mark_for_destruction if has_destroy_flag?(attributes) && allow_destroy
|
||||||
end
|
end
|
||||||
|
|
||||||
# Determines if a hash contains a truthy _destroy key.
|
# Determines if a hash contains a truthy _destroy key.
|
||||||
|
|
|
@ -827,7 +827,7 @@ class TestNestedAttributesWithNonStandardPrimaryKeys < ActiveRecord::TestCase
|
||||||
fixtures :owners, :pets
|
fixtures :owners, :pets
|
||||||
|
|
||||||
def setup
|
def setup
|
||||||
Owner.accepts_nested_attributes_for :pets
|
Owner.accepts_nested_attributes_for :pets, :allow_destroy => true
|
||||||
|
|
||||||
@owner = owners(:ashley)
|
@owner = owners(:ashley)
|
||||||
@pet1, @pet2 = pets(:chew), pets(:mochi)
|
@pet1, @pet2 = pets(:chew), pets(:mochi)
|
||||||
|
@ -844,6 +844,19 @@ class TestNestedAttributesWithNonStandardPrimaryKeys < ActiveRecord::TestCase
|
||||||
@owner.update_attributes(@params)
|
@owner.update_attributes(@params)
|
||||||
assert_equal ['Foo', 'Bar'], @owner.pets.map(&:name)
|
assert_equal ['Foo', 'Bar'], @owner.pets.map(&:name)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_attr_accessor_of_child_should_be_value_provided_during_update_attributes
|
||||||
|
@owner = owners(:ashley)
|
||||||
|
@pet1 = pets(:chew)
|
||||||
|
assert_equal nil, $current_user
|
||||||
|
attributes = {:pets_attributes => { "1"=> { :id => @pet1.id,
|
||||||
|
:name => "Foo2",
|
||||||
|
:current_user => "John",
|
||||||
|
:_destroy=>true }}}
|
||||||
|
@owner.update_attributes(attributes)
|
||||||
|
assert_equal 'John', $after_destroy_callback_output
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
class TestHasOneAutosaveAssociationWhichItselfHasAutosaveAssociations < ActiveRecord::TestCase
|
class TestHasOneAutosaveAssociationWhichItselfHasAutosaveAssociations < ActiveRecord::TestCase
|
||||||
|
|
|
@ -1,5 +1,13 @@
|
||||||
class Pet < ActiveRecord::Base
|
class Pet < ActiveRecord::Base
|
||||||
|
|
||||||
|
attr_accessor :current_user
|
||||||
|
|
||||||
set_primary_key :pet_id
|
set_primary_key :pet_id
|
||||||
belongs_to :owner, :touch => true
|
belongs_to :owner, :touch => true
|
||||||
has_many :toys
|
has_many :toys
|
||||||
|
|
||||||
|
after_destroy do |record|
|
||||||
|
$after_destroy_callback_output = record.current_user
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue