From e69eed0e10c0670869aea396cb79002da4f4580a Mon Sep 17 00:00:00 2001 From: Sam Pohlenz Date: Mon, 20 Jun 2011 11:27:04 +0930 Subject: [PATCH] Test for extractable_options? within nested fields_for. This fixes an error when a record object that is a subclass of Hash is passed to fields_for, which is incorrectly interpreted as field options. --- .../lib/action_view/helpers/form_helper.rb | 2 +- actionpack/test/template/form_helper_test.rb | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/actionpack/lib/action_view/helpers/form_helper.rb b/actionpack/lib/action_view/helpers/form_helper.rb index 3debc9cc66fa3..0ef2357368eb9 100644 --- a/actionpack/lib/action_view/helpers/form_helper.rb +++ b/actionpack/lib/action_view/helpers/form_helper.rb @@ -1241,7 +1241,7 @@ def fields_for_with_index(record_name, record_object = nil, fields_options = {}, end def fields_for(record_name, record_object = nil, fields_options = {}, &block) - fields_options, record_object = record_object, nil if record_object.is_a?(Hash) + fields_options, record_object = record_object, nil if record_object.is_a?(Hash) && record_object.extractable_options? fields_options[:builder] ||= options[:builder] fields_options[:parent_builder] = self diff --git a/actionpack/test/template/form_helper_test.rb b/actionpack/test/template/form_helper_test.rb index 0507045ad2f0d..4d90e8968ddfa 100644 --- a/actionpack/test/template/form_helper_test.rb +++ b/actionpack/test/template/form_helper_test.rb @@ -1689,6 +1689,24 @@ def test_nested_fields_uses_unique_indices_for_different_collection_associations assert_dom_equal expected, output_buffer end + def test_nested_fields_for_with_hash_like_model + @author = Author.new + def @author.is_a?(klass); klass == Hash; end + def @author.extractable_options?; false; end + + form_for(@post) do |f| + concat f.fields_for(:author, @author) { |af| + concat af.text_field(:name) + } + end + + expected = whole_form('/posts/123', 'edit_post_123', 'edit_post', :method => 'put') do + '' + end + + assert_dom_equal expected, output_buffer + end + def test_fields_for output_buffer = fields_for(:post, @post) do |f| concat f.text_field(:title)