Permalink
Browse files

Merge pull request #6225 from acapilleri/select_with_required_true_in…

…clude_first_option_blank

HTML5 validation error with options_from_collection_for_select

Fixes #5908

Conflicts:
	actionpack/CHANGELOG.md
  • Loading branch information...
2 parents 871b1c2 + 2e9c7cd commit a8cfaed3389de8c12ad8c8e363df13bd93354ab4 @rafaelfranca rafaelfranca committed May 13, 2012
View
@@ -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`.
@@ -121,6 +121,7 @@ def sanitized_value(value)
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 @@ def select_content_tag(option_tags, options, html_options)
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]
@@ -633,7 +633,28 @@ def test_select_with_nil
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 = ""
@@ -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+:

0 comments on commit a8cfaed

Please sign in to comment.