mirror of
https://github.com/github/rails.git
synced 2026-01-24 13:58:12 -05:00
Nested attribute accessors should ignore new records with truthy _delete key.
Signed-off-by: Michael Koziarski <michael@koziarski.com> [#1861 state:committed]
This commit is contained in:
committed by
Michael Koziarski
parent
4e4f961c11
commit
455a7633db
@@ -86,7 +86,8 @@ module ActiveRecord
|
||||
# For each key in the hash that starts with the string 'new' a new model
|
||||
# will be instantiated. When the proc given with the <tt>:reject_if</tt>
|
||||
# option evaluates to +false+ for a certain attribute hash no record will
|
||||
# be built for that hash.
|
||||
# be built for that hash. (Rejecting new records can alternatively be done
|
||||
# by utilizing the <tt>'_delete'</tt> key. Scroll down for more info.)
|
||||
#
|
||||
# params = { 'member' => {
|
||||
# 'name' => 'joe', 'posts_attributes' => {
|
||||
@@ -258,11 +259,14 @@ module ActiveRecord
|
||||
# If a <tt>:reject_if</tt> proc exists for this association, it will be
|
||||
# called with the attributes as its argument. If the proc returns a truthy
|
||||
# value, the record is _not_ build.
|
||||
#
|
||||
# Alternatively, you can specify the <tt>'_delete'</tt> key to _not_ build
|
||||
# a record. See should_destroy_nested_attributes_record? for more info.
|
||||
def build_new_nested_attributes_record(association_name, attributes)
|
||||
if reject_proc = self.class.reject_new_nested_attributes_procs[association_name]
|
||||
return if reject_proc.call(attributes)
|
||||
end
|
||||
send(association_name).build(attributes)
|
||||
send(association_name).build(attributes) unless should_destroy_nested_attributes_record?(true, attributes)
|
||||
end
|
||||
|
||||
# Assigns the attributes to the record specified by +id+. Or marks it for
|
||||
|
||||
@@ -233,6 +233,20 @@ module NestedAttributesOnACollectionAssociationTests
|
||||
assert_equal 'Privateers Greed', @pirate.send(@association_name).last.name
|
||||
end
|
||||
|
||||
def test_should_remove_delete_key_from_arguments_hash_of_new_records
|
||||
assert_nothing_raised ActiveRecord::UnknownAttributeError do
|
||||
@pirate.send(association_setter, { 'new_1' => { '_delete' => '0' }})
|
||||
end
|
||||
end
|
||||
|
||||
def test_should_ignore_new_associated_records_with_truthy_delete_attribute
|
||||
@pirate.send(@association_name).destroy_all
|
||||
@pirate.reload.attributes = { association_getter => { 'new_1' => { :name => 'Grace OMalley' }, 'new_2' => { :name => 'Privateers Greed', '_delete' => '1' }}}
|
||||
|
||||
assert_equal 1, @pirate.send(@association_name).length
|
||||
assert_equal 'Grace OMalley', @pirate.send(@association_name).first.name
|
||||
end
|
||||
|
||||
def test_should_sort_the_hash_by_the_keys_before_building_new_associated_models
|
||||
attributes = ActiveSupport::OrderedHash.new
|
||||
attributes['new_123726353'] = { :name => 'Grace OMalley' }
|
||||
|
||||
Reference in New Issue
Block a user