提交 66212f69 编写于 作者: N Neeraj Singh 提交者: José Valim

If a nested_attribute is being marked for destruction and at the same time an...

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: NJosé Valim <jose.valim@gmail.com>
上级 18adbe93
......@@ -417,11 +417,8 @@ def assign_nested_attributes_for_collection_association(association_name, attrib
# Updates a record with the +attributes+ or marks it for destruction if
# +allow_destroy+ is +true+ and has_destroy_flag? returns +true+.
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)
end
record.attributes = attributes.except(*UNASSIGNABLE_KEYS)
record.mark_for_destruction if has_destroy_flag?(attributes) && allow_destroy
end
# Determines if a hash contains a truthy _destroy key.
......
......@@ -827,7 +827,7 @@ class TestNestedAttributesWithNonStandardPrimaryKeys < ActiveRecord::TestCase
fixtures :owners, :pets
def setup
Owner.accepts_nested_attributes_for :pets
Owner.accepts_nested_attributes_for :pets, :allow_destroy => true
@owner = owners(:ashley)
@pet1, @pet2 = pets(:chew), pets(:mochi)
......@@ -844,6 +844,19 @@ def test_should_update_existing_records_with_non_standard_primary_key
@owner.update_attributes(@params)
assert_equal ['Foo', 'Bar'], @owner.pets.map(&:name)
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
class TestHasOneAutosaveAssociationWhichItselfHasAutosaveAssociations < ActiveRecord::TestCase
......
class Pet < ActiveRecord::Base
attr_accessor :current_user
set_primary_key :pet_id
belongs_to :owner, :touch => true
has_many :toys
after_destroy do |record|
$after_destroy_callback_output = record.current_user
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册