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
This commit is contained in:
parent
91cdd59b12
commit
344ae8326a
|
@ -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]
|
||||
|
|
|
@ -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 '</form>', 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 = {})
|
||||
|
|
|
@ -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 '</form>', proc.binding
|
||||
end
|
||||
alias_method :form_remote_for, :remote_form_for
|
||||
|
||||
|
|
|
@ -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 =
|
||||
"<label for='title'>Title:</label> <input name='post[title]' size='30' type='text' id='post_title' value='Hello World' /><br/>" +
|
||||
"<label for='body'>Body:</label> <textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea><br/>" +
|
||||
"<label for='secret'>Secret:</label> <input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
|
||||
"<input name='post[secret]' type='hidden' value='0' /><br/>"
|
||||
|
||||
|
||||
assert_dom_equal expected, _erbout
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in New Issue