From de69c798db5535f19bfd585da83117fe1dacd6d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Sat, 6 Feb 2010 20:55:25 +0100 Subject: Fix nested attributes with specified collection. --- actionpack/lib/action_view/helpers/form_helper.rb | 18 +++++++++++------- actionpack/test/template/form_helper_test.rb | 22 ++++++++++++++++++++++ 2 files changed, 33 insertions(+), 7 deletions(-) (limited to 'actionpack') diff --git a/actionpack/lib/action_view/helpers/form_helper.rb b/actionpack/lib/action_view/helpers/form_helper.rb index 238f2eb07a..ce21af9923 100644 --- a/actionpack/lib/action_view/helpers/form_helper.rb +++ b/actionpack/lib/action_view/helpers/form_helper.rb @@ -1172,7 +1172,9 @@ module ActionView def fields_for_with_nested_attributes(association_name, args, block) name = "#{object_name}[#{association_name}_attributes]" - association = args.first.to_model if args.first.respond_to?(:to_model) + options = args.extract_options! + association = args.shift + association = association.to_model if association.respond_to?(:to_model) if association.respond_to?(:new_record?) association = [association] if @object.send(association_name).is_a?(Array) @@ -1181,20 +1183,22 @@ module ActionView end if association.is_a?(Array) - explicit_child_index = args.last[:child_index] if args.last.is_a?(Hash) + explicit_child_index = options[:child_index] association.map do |child| - fields_for_nested_model("#{name}[#{explicit_child_index || nested_child_index(name)}]", child, args, block) + fields_for_nested_model("#{name}[#{explicit_child_index || nested_child_index(name)}]", child, options, block) end.join elsif association - fields_for_nested_model(name, association, args, block) + fields_for_nested_model(name, association, options, block) end end - def fields_for_nested_model(name, object, args, block) + def fields_for_nested_model(name, object, options, block) + object = object.to_model if object.respond_to?(:to_model) + if object.new_record? - @template.fields_for(name, object, *args, &block) + @template.fields_for(name, object, options, &block) else - @template.fields_for(name, object, *args) do |builder| + @template.fields_for(name, object, options) do |builder| block.call(builder) @template.concat builder.hidden_field(:id) unless builder.emitted_hidden_id? end diff --git a/actionpack/test/template/form_helper_test.rb b/actionpack/test/template/form_helper_test.rb index f2d524bd1b..7b909fff82 100644 --- a/actionpack/test/template/form_helper_test.rb +++ b/actionpack/test/template/form_helper_test.rb @@ -918,6 +918,28 @@ class FormHelperTest < ActionView::TestCase assert_dom_equal expected, output_buffer end + def test_nested_fields_for_with_existing_records_on_a_supplied_nested_attributes_collection_different_from_record_one + comments = Array.new(2) { |id| Comment.new(id + 1) } + @post.comments = [] + + form_for(:post, @post) do |f| + concat f.text_field(:title) + f.fields_for(:comments, comments) do |cf| + concat cf.text_field(:name) + end + end + + expected = '
' + + '' + + '' + + '' + + '' + + '' + + '
' + + assert_dom_equal expected, output_buffer + end + def test_nested_fields_for_on_a_nested_attributes_collection_association_yields_only_builder @post.comments = [Comment.new(321), Comment.new] yielded_comments = [] -- cgit v1.2.3