diff options
author | Rafael Mendonça França <rafaelmfranca@gmail.com> | 2012-05-13 01:00:01 -0300 |
---|---|---|
committer | Rafael Mendonça França <rafaelmfranca@gmail.com> | 2012-05-13 01:00:01 -0300 |
commit | a8cfaed3389de8c12ad8c8e363df13bd93354ab4 (patch) | |
tree | eeda43a98880df9f068f572c342dcef420b69cfc | |
parent | 871b1c2115182e7273b75b76518733374a9883b3 (diff) | |
parent | 2e9c7cd5f603dd27015cddb17c6ea328e9baa0d5 (diff) | |
download | rails-a8cfaed3389de8c12ad8c8e363df13bd93354ab4.tar.gz rails-a8cfaed3389de8c12ad8c8e363df13bd93354ab4.tar.bz2 rails-a8cfaed3389de8c12ad8c8e363df13bd93354ab4.zip |
Merge pull request #6225 from acapilleri/select_with_required_true_include_first_option_blank
HTML5 validation error with options_from_collection_for_select
Fixes #5908
Conflicts:
actionpack/CHANGELOG.md
-rw-r--r-- | actionpack/CHANGELOG.md | 3 | ||||
-rw-r--r-- | actionpack/lib/action_view/helpers/tags/base.rb | 5 | ||||
-rw-r--r-- | actionpack/test/template/form_options_helper_test.rb | 21 | ||||
-rw-r--r-- | guides/source/form_helpers.textile | 2 |
4 files changed, 31 insertions, 0 deletions
diff --git a/actionpack/CHANGELOG.md b/actionpack/CHANGELOG.md index 24cbe35acc..b731fceb97 100644 --- a/actionpack/CHANGELOG.md +++ b/actionpack/CHANGELOG.md @@ -1,5 +1,8 @@ ## Rails 4.0.0 (unreleased) ## +* The `select` method (select tag) forces :include_blank if `required` is true and + `display size` is one and `multiple` is not true. *Angelo Capilleri* + * Copy literal route constraints to defaults so that url generation know about them. The copied constraints are `:protocol`, `:subdomain`, `:domain`, `:host` and `:port`. diff --git a/actionpack/lib/action_view/helpers/tags/base.rb b/actionpack/lib/action_view/helpers/tags/base.rb index e4f431a6d7..bf209d3a20 100644 --- a/actionpack/lib/action_view/helpers/tags/base.rb +++ b/actionpack/lib/action_view/helpers/tags/base.rb @@ -121,6 +121,7 @@ module ActionView def select_content_tag(option_tags, options, html_options) html_options = html_options.stringify_keys add_default_name_and_id(html_options) + options[:include_blank] = true if option_required?(html_options) select = content_tag("select", add_options(option_tags, options, value(object)), html_options) if html_options["multiple"] && options.fetch(:include_hidden, true) @@ -129,6 +130,10 @@ module ActionView select end end + + def option_required?(html_options) + html_options["required"] && html_options["size"].to_i == 1 && !html_options["multiple"] + end def add_options(option_tags, options, value = nil) if options[:include_blank] diff --git a/actionpack/test/template/form_options_helper_test.rb b/actionpack/test/template/form_options_helper_test.rb index 2c0da8473a..8b3a51bc6d 100644 --- a/actionpack/test/template/form_options_helper_test.rb +++ b/actionpack/test/template/form_options_helper_test.rb @@ -633,7 +633,28 @@ class FormOptionsHelperTest < ActionView::TestCase select("post", "category", [nil, "othervalue"]) ) end + + def test_select_with_included_and_display_size_equals_to_one + assert_dom_equal( + "<select id=\"post_category\" name=\"post[category]\" required=\"required\" size=\"1\"><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),{}, :required => true, :size => 1) + ) + end + + def test_select_with_included_and_display_size_no_equals_to_one + assert_dom_equal( + "<select id=\"post_category\" name=\"post[category]\" required=\"required\" size=\"2\"><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),{}, :required => true, :size => 2) + ) + end + def test_select_with_included_and_multiple + assert_dom_equal( + "<input name=\"post[category][]\" type=\"hidden\" value=\"\"/><select id=\"post_category\" multiple=\"multiple\" name=\"post[category][]\" required=\"required\" size=\"1\"><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), {}, :required => true, :size => 1, :multiple => true) + ) + end + def test_select_with_fixnum @post = Post.new @post.category = "" diff --git a/guides/source/form_helpers.textile b/guides/source/form_helpers.textile index b6420db798..b2c05492ab 100644 --- a/guides/source/form_helpers.textile +++ b/guides/source/form_helpers.textile @@ -405,6 +405,8 @@ Whenever Rails sees that the internal value of an option being generated matches TIP: The second argument to +options_for_select+ must be exactly equal to the desired internal value. In particular if the value is the integer 2 you cannot pass "2" to +options_for_select+ -- you must pass 2. Be aware of values extracted from the +params+ hash as they are all strings. +WARNING: +:include_blank+ is forced true if the attributes +required+ is true, display +size+ is one and +multiple+ is not true. + h4. Select Boxes for Dealing with Models In most cases form controls will be tied to a specific database model and as you might expect Rails provides helpers tailored for that purpose. Consistent with other form helpers, when dealing with models you drop the +_tag+ suffix from +select_tag+: |