From b0a1aa7e7e4bc1b0a714fd143cc91944e2f4d230 Mon Sep 17 00:00:00 2001 From: Jamis Buck Date: Wed, 17 Jan 2007 00:04:02 +0000 Subject: Allow fields_for to be nested in form_for git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@5965 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionpack/CHANGELOG | 2 ++ actionpack/lib/action_view/helpers/form_helper.rb | 17 +++++++++--- actionpack/test/template/form_helper_test.rb | 33 ++++++++++++++++++++--- 3 files changed, 45 insertions(+), 7 deletions(-) diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index 5720d9713f..c3cfcc0ab6 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Allow fields_for to be nested inside form_for, so that the name and id get properly constructed [Jamis Buck] + * Allow inGroupsOf and eachSlice to be called through rjs. #7046 [Cody Fauser] * Allow exempt_from_layout :rhtml. #6742, #7026 [dcmanges, Squeegy] diff --git a/actionpack/lib/action_view/helpers/form_helper.rb b/actionpack/lib/action_view/helpers/form_helper.rb index 8aa0b42fe1..1c0829b300 100644 --- a/actionpack/lib/action_view/helpers/form_helper.rb +++ b/actionpack/lib/action_view/helpers/form_helper.rb @@ -401,11 +401,15 @@ module ActionView end def tag_id - "#{@object_name}_#{@method_name}" + "#{sanitized_object_name}_#{@method_name}" end def tag_id_with_index(index) - "#{@object_name}_#{index}_#{@method_name}" + "#{sanitized_object_name}_#{index}_#{@method_name}" + end + + def sanitized_object_name + @object_name.gsub(/[^-a-zA-Z0-9:.]/, "_").sub(/_$/, "") end end @@ -420,7 +424,7 @@ module ActionView @object_name, @object, @template, @options, @proc = object_name, object, template, options, proc end - (field_helpers - %w(check_box radio_button)).each do |selector| + (field_helpers - %w(check_box radio_button fields_for)).each do |selector| src = <<-end_src def #{selector}(method, options = {}) @template.send(#{selector.inspect}, @object_name, method, options.merge(:object => @object)) @@ -428,7 +432,12 @@ module ActionView end_src class_eval src, __FILE__, __LINE__ end - + + def fields_for(name, *args, &block) + name = "#{object_name}[#{name}]" + @template.fields_for(name, *args, &block) + end + def check_box(method, options = {}, checked_value = "1", unchecked_value = "0") @template.check_box(@object_name, method, options.merge(:object => @object), checked_value, unchecked_value) end diff --git a/actionpack/test/template/form_helper_test.rb b/actionpack/test/template/form_helper_test.rb index a7ceb6b30f..4796e3d35d 100644 --- a/actionpack/test/template/form_helper_test.rb +++ b/actionpack/test/template/form_helper_test.rb @@ -297,11 +297,28 @@ class FormHelperTest < Test::Unit::TestCase expected = "
" + - "" + - "" + - "" + + "" + + "" + + "" + "" + "
" + + assert_dom_equal expected, _erbout + end + + def test_nested_fields_for + _erbout = '' + form_for(:post, @post) do |f| + f.fields_for(:comment, @post) do |c| + _erbout.concat c.text_field(:title) + end + end + + expected = "
" + + "" + + "
" + + assert_dom_equal expected, _erbout end def test_fields_for @@ -339,6 +356,16 @@ class FormHelperTest < Test::Unit::TestCase assert_dom_equal expected, _erbout end + def test_fields_for_object_with_bracketed_name + _erbout = '' + fields_for("author[post]", @post) do |f| + _erbout.concat f.text_field(:title) + end + + assert_dom_equal "", + _erbout + end + def test_form_builder_does_not_have_form_for_method assert ! ActionView::Helpers::FormBuilder.instance_methods.include?('form_for') end -- cgit v1.2.3