`ActionView::Helpers::FormOptionsHelper#select` should mark option for `nil` as selected

```ruby
 @post = Post.new
 @post.category = nil

 # Before
 select("post", "category", none: nil, programming: 1, economics: 2)
 # =>
 # <select name="post[category]" id="post_category">
 #   <option value="">none</option>
 #  <option value="1">programming</option>
 #  <option value="2">economics</option>
 # </select>

 # After
 select("post", "category", none: nil, programming: 1, economics: 2)
 # =>
 # <select name="post[category]" id="post_category">
 #   <option selected="selected" value="">none</option>
 #  <option value="1">programming</option>
 #  <option value="2">economics</option>
 # </select>
 ```

To get the same result without these changes we can set `:selected` as `@post.category.to_s`:
 ```ruby
 select("post", "category", {none: nil, programming: 1, economics: 2}, {selected: @post.category.to_s}
 ```
This commit is contained in:
bogdanvlviv 2018-12-27 18:18:32 +02:00
parent 0434e5ba23
commit cd2cbdcb48
No known key found for this signature in database
GPG Key ID: E4ACD76A6DB6DFDD
3 changed files with 46 additions and 1 deletions

View File

@ -1,3 +1,30 @@
* `ActionView::Helpers::FormOptionsHelper#select` should mark option for `nil` as selected.
```ruby
@post = Post.new
@post.category = nil
# Before
select("post", "category", none: nil, programming: 1, economics: 2)
# =>
# <select name="post[category]" id="post_category">
# <option value="">none</option>
# <option value="1">programming</option>
# <option value="2">economics</option>
# </select>
# After
select("post", "category", none: nil, programming: 1, economics: 2)
# =>
# <select name="post[category]" id="post_category">
# <option selected="selected" value="">none</option>
# <option value="1">programming</option>
# <option value="2">economics</option>
# </select>
```
*bogdanvlviv*
* Log lines for partial renders and started template renders are now
emitted at the `DEBUG` level instead of `INFO`.

View File

@ -15,7 +15,7 @@ module ActionView
def render
option_tags_options = {
selected: @options.fetch(:selected) { value },
selected: @options.fetch(:selected) { value.to_s },
disabled: @options[:disabled]
}

View File

@ -826,6 +826,24 @@ class FormOptionsHelperTest < ActionView::TestCase
)
end
def test_select_with_nil_as_selected_value
@post = Post.new
@post.category = nil
assert_dom_equal(
"<select name=\"post[category]\" id=\"post_category\"><option selected=\"selected\" value=\"\">none</option>\n<option value=\"1\">programming</option>\n<option value=\"2\">economics</option></select>",
select("post", "category", none: nil, programming: 1, economics: 2)
)
end
def test_select_with_nil_and_selected_option_as_nil
@post = Post.new
@post.category = nil
assert_dom_equal(
"<select name=\"post[category]\" id=\"post_category\"><option value=\"\">none</option>\n<option value=\"1\">programming</option>\n<option value=\"2\">economics</option></select>",
select("post", "category", { none: nil, programming: 1, economics: 2 }, { selected: nil })
)
end
def test_required_select
assert_dom_equal(
%(<select id="post_category" name="post[category]" required="required"><option value=""></option>\n<option value="abe">abe</option>\n<option value="mus">mus</option>\n<option value="hest">hest</option></select>),