From 344ae8326a51beabbc5b3f4f851c3d65ec789e2d Mon Sep 17 00:00:00 2001 From: Nicholas Seckar Date: Sat, 11 Feb 2006 23:29:53 +0000 Subject: Remove over-engineered form_for code for a leaner implementation. Document form_for's :html option. git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3572 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionpack/CHANGELOG | 4 +++ actionpack/lib/action_view/helpers/form_helper.rb | 39 ++++++++-------------- .../lib/action_view/helpers/prototype_helper.rb | 4 ++- actionpack/test/template/form_helper_test.rb | 14 ++++---- 4 files changed, 27 insertions(+), 34 deletions(-) diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index cb4a60bc1e..35a8f7bca5 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,9 @@ *SVN* +* Remove over-engineered form_for code for a leaner implementation. [Nicholas Seckar] + +* Document form_for's :html option. [Nicholas Seckar] + * Major components cleanup and speedup. #3527 [Stefan Kaes] * Fix problems with pagination and :include. [Kevin Clark] diff --git a/actionpack/lib/action_view/helpers/form_helper.rb b/actionpack/lib/action_view/helpers/form_helper.rb index 872453b753..81f6fec827 100644 --- a/actionpack/lib/action_view/helpers/form_helper.rb +++ b/actionpack/lib/action_view/helpers/form_helper.rb @@ -98,6 +98,12 @@ module ActionView # Note: This also works for the methods in FormOptionHelper and DateHelper that are designed to work with an object as base. # Like collection_select and datetime_select. # + # Html attributes for the form tag can be given as :html => {...}. Example: + # + # <% form_for :person, @person, :html => {:id => 'person_form'} do |f| %> + # ... + # <% end %> + # # You can also build forms using a customized FormBuilder class. Subclass FormBuilder and override or define some more helpers, # then use your custom builder like so: # @@ -115,22 +121,9 @@ module ActionView # end # def form_for(object_name, object, options = {}, &proc) - raise ArgumentError, "form_for requires a block!" unless proc - - url_options = options.delete(:url) || {} - form_tag_selector = options.delete(:form_tag_selector) || :form_tag - form_options = options.delete(:html) || {} - [:method, :multipart].each { |key| form_options[key] = options.delete(key) if options.key? key } - - fields_for(object_name, object, options.merge(:proc => proc)) do |builder| - if form_tag_selector == :form_remote_tag - concat send(form_tag_selector, form_options.merge(:url => url_options, :html => form_options)), proc.binding - else - concat send(form_tag_selector, url_options, form_options), proc.binding - end - builder.build_form(url_options, form_options) { proc.call builder } - concat end_form_tag, proc.binding - end + concat form_tag(options, options.delete(:html) || {}), proc.binding + fields_for(object_name, object, options, &proc) + concat '', proc.binding end # Creates a scope around a specific model object like form_for, but doesn't create the form tags themselves. This makes @@ -148,11 +141,10 @@ module ActionView # Note: This also works for the methods in FormOptionHelper and DateHelper that are designed to work with an object as base. # Like collection_select and datetime_select. def fields_for(object_name, object, options = {}, &proc) - raise ArgumentError, "fields_for requires a block!" unless proc - - builder = options[:builder] || FormBuilder - form_builder = builder.new(object_name, object, self, options, options[:proc] || proc) - proc.call(form_builder) + raise ArgumentError, "fields_for requires a block!" unless block_given? + builder_klass = options[:builder] || FormBuilder + form_builder = builder_klass.new(object_name, object, self, options, proc) + yield form_builder end # Returns an input tag of the "text" type tailored for accessing a specified attribute (identified by +method+) on an object @@ -389,11 +381,6 @@ module ActionView @object_name, @object, @template, @options, @proc = object_name, object, template, options, proc end - # An empty stub that can be overriden to wrap a form created by form_for. - def build_form(url_options, form_options, &proc) - proc.call self - end - (field_helpers - %w(check_box radio_button)).each do |selector| src = <<-end_src def #{selector}(method, options = {}) diff --git a/actionpack/lib/action_view/helpers/prototype_helper.rb b/actionpack/lib/action_view/helpers/prototype_helper.rb index 523adb3288..96f065cc11 100644 --- a/actionpack/lib/action_view/helpers/prototype_helper.rb +++ b/actionpack/lib/action_view/helpers/prototype_helper.rb @@ -172,7 +172,9 @@ module ActionView # Works like form_remote_tag, but uses form_for semantics. def remote_form_for(object_name, object, options = {}, &proc) - form_for(object_name, object, options.merge(:form_tag_selector => :form_remote_tag), &proc) + concat form_remote_tag(options), proc.binding + fields_for(object_name, object, options, &proc) + concat '', proc.binding end alias_method :form_remote_for, :remote_form_for diff --git a/actionpack/test/template/form_helper_test.rb b/actionpack/test/template/form_helper_test.rb index 1010598f65..20c90ea832 100644 --- a/actionpack/test/template/form_helper_test.rb +++ b/actionpack/test/template/form_helper_test.rb @@ -268,7 +268,7 @@ class FormHelperTest < Test::Unit::TestCase assert_dom_equal expected, _erbout end - class LabellingBulider < ActionView::Helpers::FormBuilder + class LabelledFormBuilder < ActionView::Helpers::FormBuilder (field_helpers - %w(hidden_field)).each do |selector| src = <<-END_SRC def #{selector}(field, *args, &proc) @@ -282,7 +282,7 @@ class FormHelperTest < Test::Unit::TestCase def test_form_for_with_labelled_builder _erbout = '' - form_for(:post, @post, :builder => LabellingBulider) do |f| + form_for(:post, @post, :builder => LabelledFormBuilder) do |f| _erbout.concat f.text_field(:title) _erbout.concat f.text_area(:body) _erbout.concat f.check_box(:secret) @@ -304,7 +304,7 @@ class FormHelperTest < Test::Unit::TestCase self.extend ActionView::Helpers::PrototypeHelper _erbout = '' - remote_form_for(:post, @post, :builder => LabellingBulider) do |f| + remote_form_for(:post, @post, :builder => LabelledFormBuilder) do |f| _erbout.concat f.text_field(:title) _erbout.concat f.text_area(:body) _erbout.concat f.check_box(:secret) @@ -323,19 +323,19 @@ class FormHelperTest < Test::Unit::TestCase def test_fields_for_with_labelled_builder _erbout = '' - - fields_for(:post, @post, :builder => LabellingBulider) do |f| + + fields_for(:post, @post, :builder => LabelledFormBuilder) do |f| _erbout.concat f.text_field(:title) _erbout.concat f.text_area(:body) _erbout.concat f.check_box(:secret) end - + expected = "
" + "
" + " " + "
" - + assert_dom_equal expected, _erbout end -- cgit v1.2.3