Skip to content

Commit

Permalink
backport of #5706 and #5579 to 3-0-stable
Browse files Browse the repository at this point in the history
[#5706 state:resolved]

Signed-off-by: José Valim <jose.valim@gmail.com>
  • Loading branch information
Neeraj Singh authored and josevalim committed Sep 28, 2010
1 parent e0411f3 commit 2525bfc
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 3 deletions.
6 changes: 3 additions & 3 deletions activerecord/lib/active_record/nested_attributes.rb
Expand Up @@ -293,7 +293,7 @@ def assign_nested_attributes_for_one_to_one_association(association_name, attrib

if check_existing_record && (record = send(association_name)) &&
(options[:update_only] || record.id.to_s == attributes['id'].to_s)
assign_to_or_mark_for_destruction(record, attributes, options[:allow_destroy])
assign_to_or_mark_for_destruction(record, attributes, options[:allow_destroy]) unless call_reject_if(association_name, attributes)

elsif attributes['id']
existing_record = self.class.reflect_on_association(association_name).klass.find(attributes['id'])
Expand Down Expand Up @@ -376,11 +376,11 @@ def assign_nested_attributes_for_collection_association(association_name, attrib

elsif existing_records.count == 0 #Existing record but not yet associated
existing_record = self.class.reflect_on_association(association_name).klass.find(attributes['id'])
association.send(:add_record_to_target_with_callbacks, existing_record) unless association.loaded?
association.send(:add_record_to_target_with_callbacks, existing_record) if !association.loaded? && !call_reject_if(association_name, attributes)
assign_to_or_mark_for_destruction(existing_record, attributes, options[:allow_destroy])

elsif existing_record = existing_records.detect { |record| record.id.to_s == attributes['id'].to_s }
association.send(:add_record_to_target_with_callbacks, existing_record) unless association.loaded?
association.send(:add_record_to_target_with_callbacks, existing_record) if !association.loaded? && !call_reject_if(association_name, attributes)
assign_to_or_mark_for_destruction(existing_record, attributes, options[:allow_destroy])

end
Expand Down
16 changes: 16 additions & 0 deletions activerecord/test/cases/nested_attributes_test.rb
Expand Up @@ -122,6 +122,22 @@ def test_has_many_association_updating_a_single_record
man.update_attributes({:interests_attributes => {:topic => 'gardening', :id => interest.id}})
assert_equal 'gardening', interest.reload.topic
end

def test_reject_if_with_a_proc_which_returns_true_always_for_has_one
Pirate.accepts_nested_attributes_for :ship, :reject_if => proc {|attributes| true }
pirate = Pirate.new(:catchphrase => "Stop wastin' me time")
ship = pirate.create_ship(:name => 's1')
pirate.update_attributes({:ship_attributes => { :name => 's2', :id => ship.id } })
assert_equal 's1', ship.reload.name
end

def test_reject_if_with_a_proc_which_returns_true_always_for_has_many
Man.accepts_nested_attributes_for :interests, :reject_if => proc {|attributes| true }
man = Man.create(:name => "John")
interest = man.interests.create(:topic => 'photography')
man.update_attributes({:interests_attributes => { :topic => 'gardening', :id => interest.id } })
assert_equal 'photography', interest.reload.topic
end

end

Expand Down

0 comments on commit 2525bfc

Please sign in to comment.