From ebf66379186db094ba94914c2aed4e6a485d4708 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 20 Mar 2005 14:49:37 +0000 Subject: Added that the html options disabled, readonly, and multiple can all be treated as booleans. So specifying disabled => :true will give disabled="disabled". #809 [mindel] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@932 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- .../lib/action_view/helpers/form_tag_helper.rb | 34 +++++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) (limited to 'actionpack/lib/action_view/helpers') diff --git a/actionpack/lib/action_view/helpers/form_tag_helper.rb b/actionpack/lib/action_view/helpers/form_tag_helper.rb index 2fc055686b..d8535d2870 100644 --- a/actionpack/lib/action_view/helpers/form_tag_helper.rb +++ b/actionpack/lib/action_view/helpers/form_tag_helper.rb @@ -5,6 +5,9 @@ module ActionView module Helpers # Provides a number of methods for creating form tags that doesn't rely on conventions with an object assigned to the template like # FormHelper does. With the FormTagHelper, you provide the names and values yourself. + # + # NOTE: The html options disabled, readonly, and multiple can all be treated as booleans. So specifying disabled => :true + # will give disabled="disabled". module FormTagHelper # Starts a form tag that points the action to an url configured with url_for_options just like # ActionController::Base#url_for. The method for the form defaults to POST. @@ -31,11 +34,11 @@ module ActionView end def select_tag(name, option_tags = nil, options = {}) - content_tag("select", option_tags, { "name" => name, "id" => name }.update(options.stringify_keys)) + content_tag("select", option_tags, { "name" => name, "id" => name }.update(convert_options(options))) end def text_field_tag(name, value = nil, options = {}) - tag("input", { "type" => "text", "name" => name, "id" => name, "value" => value }.update(options.stringify_keys)) + tag("input", { "type" => "text", "name" => name, "id" => name, "value" => value }.update(convert_options(options))) end def hidden_field_tag(name, value = nil, options = {}) @@ -43,11 +46,11 @@ module ActionView end def file_field_tag(name, options = {}) - text_field_tag(name, nil, options.stringify_keys.update("type" => "file")) + text_field_tag(name, nil, convert_options(options).update("type" => "file")) end def password_field_tag(name = "password", value = nil, options = {}) - text_field_tag(name, value, options.stringify_keys.update("type" => "password")) + text_field_tag(name, value, convert_options(options).update("type" => "password")) end def text_area_tag(name, content = nil, options = {}) @@ -57,24 +60,39 @@ module ActionView options.delete("size") end - content_tag("textarea", content, { "name" => name, "id" => name }.update(options.stringify_keys)) + content_tag("textarea", content, { "name" => name, "id" => name }.update(convert_options(options))) end def check_box_tag(name, value = "1", checked = false, options = {}) - html_options = { "type" => "checkbox", "name" => name, "id" => name, "value" => value }.update(options.stringify_keys) + html_options = { "type" => "checkbox", "name" => name, "id" => name, "value" => value }.update(convert_options(options)) html_options["checked"] = "checked" if checked tag("input", html_options) end def radio_button_tag(name, value, checked = false, options = {}) - html_options = { "type" => "radio", "name" => name, "id" => name, "value" => value }.update(options.stringify_keys) + html_options = { "type" => "radio", "name" => name, "id" => name, "value" => value }.update(convert_options(options)) html_options["checked"] = "checked" if checked tag("input", html_options) end def submit_tag(value = "Save changes", options = {}) - tag("input", { "type" => "submit", "name" => "submit", "value" => value }.update(options.stringify_keys)) + tag("input", { "type" => "submit", "name" => "submit", "value" => value }.update(convert_options(options))) end + + private + def convert_options(options) + options = options.stringify_keys + %w( disabled readonly multiple ).each { |a| boolean_attribute(options, a) } + options + end + + def boolean_attribute(options, attribute) + if options[attribute] + options[attribute] = attribute + else + options.delete attribute + end + end end end end -- cgit v1.2.3