diff options
author | David Heinemeier Hansson <david@loudthinking.com> | 2005-07-03 12:23:16 +0000 |
---|---|---|
committer | David Heinemeier Hansson <david@loudthinking.com> | 2005-07-03 12:23:16 +0000 |
commit | c52edf2319eccf0feafcec7ac4fd0164011a06db (patch) | |
tree | 402b05d4759b9ff6dfd23c8fc901df705a35d08e | |
parent | 5524dedc06b142c98c35fbd86b24f37bc10458b3 (diff) | |
download | rails-c52edf2319eccf0feafcec7ac4fd0164011a06db.tar.gz rails-c52edf2319eccf0feafcec7ac4fd0164011a06db.tar.bz2 rails-c52edf2319eccf0feafcec7ac4fd0164011a06db.zip |
Added :prompt option to FormOptions#select (and the users of it, like FormOptions#select_country etc) to create "Please select" style descriptors #1181 [Michael Schuerig]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@1646 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
-rw-r--r-- | actionpack/CHANGELOG | 2 | ||||
-rw-r--r-- | actionpack/lib/action_view/helpers/form_options_helper.rb | 22 | ||||
-rw-r--r-- | actionpack/test/template/form_options_helper_test.rb | 36 |
3 files changed, 53 insertions, 7 deletions
diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index 174137ac30..a0a46114ae 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Added :prompt option to FormOptions#select (and the users of it, like FormOptions#select_country etc) to create "Please select" style descriptors #1181 [Michael Schuerig] + * Added JavascriptHelper#update_element_function, which returns a Javascript function (or expression) that'll update a DOM element according to the options passed #933 [mortonda@dgrmm.net]. Examples: <%= update_element_function("products", :action => :insert, :position => :bottom, :content => "<p>New product!</p>") %> diff --git a/actionpack/lib/action_view/helpers/form_options_helper.rb b/actionpack/lib/action_view/helpers/form_options_helper.rb index 92b3f59944..b17f4284b0 100644 --- a/actionpack/lib/action_view/helpers/form_options_helper.rb +++ b/actionpack/lib/action_view/helpers/form_options_helper.rb @@ -22,6 +22,8 @@ module ActionView # <option>poem</option> # </select> # + # * <tt>:prompt</tt> - set to true or a prompt string. When the select element doesn't have a value yet, this prepends an option with a generic prompt -- "Please select" -- or the given prompt string. + # # Another common case is a select tag for an <tt>belongs_to</tt>-associated object. For example, # # select("post", "person_id", Person.find_all.collect {|p| [ p.name, p.id ] }) @@ -294,37 +296,43 @@ module ActionView def to_select_tag(choices, options, html_options) html_options = html_options.stringify_keys add_default_name_and_id(html_options) - content_tag("select", add_blank_option(options_for_select(choices, value), options[:include_blank]), html_options) + content_tag("select", add_options(options_for_select(choices, value), options, value), html_options) end def to_collection_select_tag(collection, value_method, text_method, options, html_options) html_options = html_options.stringify_keys add_default_name_and_id(html_options) content_tag( - "select", add_blank_option(options_from_collection_for_select(collection, value_method, text_method, value), options[:include_blank]), html_options + "select", add_options(options_from_collection_for_select(collection, value_method, text_method, value), options, value), html_options ) end def to_country_select_tag(priority_countries, options, html_options) html_options = html_options.stringify_keys add_default_name_and_id(html_options) - content_tag("select", add_blank_option(country_options_for_select(value, priority_countries), options[:include_blank]), html_options) + content_tag("select", add_options(country_options_for_select(value, priority_countries), options, value), html_options) end def to_time_zone_select_tag(priority_zones, options, html_options) html_options = html_options.stringify_keys add_default_name_and_id(html_options) content_tag("select", - add_blank_option( + add_options( time_zone_options_for_select(value, priority_zones, options[:model] || TimeZone), - options[:include_blank] + options, value ), html_options ) end private - def add_blank_option(option_tags, add_blank) - add_blank ? "<option value=\"\"></option>\n" + option_tags : option_tags + def add_options(option_tags, options, value = nil) + option_tags = "<option value=\"\"></option>\n" + option_tags if options[:include_blank] + + if value.blank? && options[:prompt] + ("<option value=\"\">#{options[:prompt].kind_of?(String) ? options[:prompt] : 'Please select'}</option>\n") + option_tags + else + option_tags + end end end end diff --git a/actionpack/test/template/form_options_helper_test.rb b/actionpack/test/template/form_options_helper_test.rb index 2d96bc8099..7a83f57341 100644 --- a/actionpack/test/template/form_options_helper_test.rb +++ b/actionpack/test/template/form_options_helper_test.rb @@ -221,6 +221,42 @@ class FormOptionsHelperTest < Test::Unit::TestCase ) end + def test_select_with_default_prompt + @post = Post.new + @post.category = "" + assert_equal( + "<select id=\"post_category\" name=\"post[category]\"><option value=\"\">Please select</option>\n<option value=\"abe\">abe</option>\n<option value=\"<mus>\"><mus></option>\n<option value=\"hest\">hest</option></select>", + select("post", "category", %w( abe <mus> hest), :prompt => true) + ) + end + + def test_select_no_prompt_when_select_has_value + @post = Post.new + @post.category = "<mus>" + assert_equal( + "<select id=\"post_category\" name=\"post[category]\"><option value=\"abe\">abe</option>\n<option value=\"<mus>\" selected=\"selected\"><mus></option>\n<option value=\"hest\">hest</option></select>", + select("post", "category", %w( abe <mus> hest), :prompt => true) + ) + end + + def test_select_with_given_prompt + @post = Post.new + @post.category = "" + assert_equal( + "<select id=\"post_category\" name=\"post[category]\"><option value=\"\">The prompt</option>\n<option value=\"abe\">abe</option>\n<option value=\"<mus>\"><mus></option>\n<option value=\"hest\">hest</option></select>", + select("post", "category", %w( abe <mus> hest), :prompt => 'The prompt') + ) + end + + def test_select_with_prompt_and_blank + @post = Post.new + @post.category = "" + assert_equal( + "<select id=\"post_category\" name=\"post[category]\"><option value=\"\">Please select</option>\n<option value=\"\"></option>\n<option value=\"abe\">abe</option>\n<option value=\"<mus>\"><mus></option>\n<option value=\"hest\">hest</option></select>", + select("post", "category", %w( abe <mus> hest), :prompt => true, :include_blank => true) + ) + end + def test_collection_select @posts = [ Post.new("<Abe> went home", "<Abe>", "To a little house", "shh!"), |