Let select render default selected option for required field

This commit is contained in:
Serj Prikhodko 2018-02-22 21:37:15 +03:00
parent 39d2cde659
commit 9afec1639d
3 changed files with 36 additions and 1 deletions

View File

@ -1,5 +1,26 @@
## Rails 6.0.0.alpha (Unreleased) ##
* Enable select tag helper to mark `prompt` option as `selected` and/or `disabled` for `required`
field. Example:
select :post,
:category,
["lifestyle", "programming", "spiritual"],
{ selected: "", disabled: "", prompt: "Choose one" },
{ required: true }
Placeholder option would be selected and disabled. The HTML produced:
<select required="required" name="post[category]" id="post_category">
<option disabled="disabled" selected="selected" value="">Choose one</option>
<option value="lifestyle">lifestyle</option>
<option value="programming">programming</option>
<option value="spiritual">spiritual</option></select>
For details see GH#32080
*Sergey Prikhodko*
* Don't enforce UTF-8 by default
With the disabling of TLS 1.0 by most major websites, continuing to run

View File

@ -170,7 +170,11 @@ module ActionView
option_tags = tag_builder.content_tag_string("option", options[:include_blank].kind_of?(String) ? options[:include_blank] : nil, value: "") + "\n" + option_tags
end
if value.blank? && options[:prompt]
option_tags = tag_builder.content_tag_string("option", prompt_text(options[:prompt]), value: "") + "\n" + option_tags
tag_options = { value: "" }.tap do |prompt_opts|
prompt_opts[:disabled] = true if options[:disabled] == ""
prompt_opts[:selected] = true if options[:selected] == ""
end
option_tags = tag_builder.content_tag_string("option", prompt_text(options[:prompt]), tag_options) + "\n" + option_tags
end
option_tags
end

View File

@ -511,6 +511,16 @@ class FormOptionsHelperTest < ActionView::TestCase
)
end
def test_required_select_with_default_and_selected_placeholder
assert_dom_equal(
['<select required="required" name="post[category]" id="post_category"><option disabled="disabled" selected="selected" value="">Choose one</option>',
'<option value="lifestyle">lifestyle</option>',
'<option value="programming">programming</option>',
'<option value="spiritual">spiritual</option></select>'].join("\n"),
select(:post, :category, ["lifestyle", "programming", "spiritual"], { selected: "", disabled: "", prompt: "Choose one" }, { required: true })
)
end
def test_select_with_grouped_collection_as_nested_array
@post = Post.new