Skip to content

Commit f4f954f

Browse files
authored
Merge pull request rails#46629 from ghiculescu/select-merge-options
Allow `f.select` to be called with a single hash containing options and HTML options
2 parents ee5aec2 + 49c2e51 commit f4f954f

File tree

3 files changed

+55
-29
lines changed

3 files changed

+55
-29
lines changed

actionview/CHANGELOG.md

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,22 @@
1-
* Datatime form helpers (`time_field`, `date_field`, `datetime_field`, `week_field`, `month_field`) now accept an instance of Time/Date/DateTime as `:value` option.
1+
* `select` can now be called with a single hash containing options and some HTML options
2+
3+
Previously this would not work as expected:
4+
5+
```erb
6+
<%= select :post, :author, authors, required: true %>
7+
```
8+
9+
Instead you needed to do this:
10+
11+
```erb
12+
<%= select :post, :author, authors, {}, required: true %>
13+
```
14+
15+
Now, either form is accepted, for the following HTML attributes: `required`, `multiple`, `size`.
16+
17+
*Alex Ghiculescu*
18+
19+
* Datetime form helpers (`time_field`, `date_field`, `datetime_field`, `week_field`, `month_field`) now accept an instance of Time/Date/DateTime as `:value` option.
220
321
Before:
422
```erb

actionview/lib/action_view/helpers/tags/base.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,10 @@ def sanitized_value(value)
122122

123123
def select_content_tag(option_tags, options, html_options)
124124
html_options = html_options.stringify_keys
125+
[:required, :multiple, :size].each do |prop|
126+
html_options[prop.to_s] = options.delete(prop) if options.key?(prop) && !html_options.key?(prop.to_s)
127+
end
128+
125129
add_default_name_and_id(html_options)
126130

127131
if placeholder_required?(html_options)

actionview/test/template/form_options_helper_test.rb

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -873,52 +873,56 @@ def test_select_with_nil_and_selected_option_as_nil
873873
def test_select_with_array
874874
@continent = Continent.new
875875
@continent.countries = ["Africa", "Europe"]
876-
assert_dom_equal(
877-
%(<select name="continent[countries]" id="continent_countries"><option selected="selected" value="Africa">Africa</option>\n<option selected="selected" value="Europe">Europe</option>\n<option value="America">America</option></select>),
878-
select("continent", "countries", %W(Africa Europe America), { multiple: true })
879-
)
876+
877+
expected_with_hidden_field_and_multiple = %(<input name="continent[countries][]" type="hidden" value="" autocomplete="off"/><select name="continent[countries][]" id="continent_countries" multiple="multiple"><option selected="selected" value="Africa">Africa</option>\n<option selected="selected" value="Europe">Europe</option>\n<option value="America">America</option></select>)
878+
expected_without_hidden_field = %(<select name="continent[countries]" id="continent_countries"><option selected="selected" value="Africa">Africa</option>\n<option selected="selected" value="Europe">Europe</option>\n<option value="America">America</option></select>)
879+
880+
assert_dom_equal(expected_with_hidden_field_and_multiple, select("continent", "countries", %W(Africa Europe America), { multiple: true }))
881+
assert_dom_equal(expected_with_hidden_field_and_multiple, select("continent", "countries", %W(Africa Europe America), multiple: true))
882+
assert_dom_equal(expected_with_hidden_field_and_multiple, select("continent", "countries", %W(Africa Europe America), {}, { multiple: true }))
883+
assert_dom_equal(expected_without_hidden_field, select("continent", "countries", %W(Africa Europe America)))
880884
end
881885

882886
def test_required_select
883-
assert_dom_equal(
884-
%(<select id="post_category" name="post[category]" required="required"><option value="" label=" "></option>\n<option value="abe">abe</option>\n<option value="mus">mus</option>\n<option value="hest">hest</option></select>),
885-
select("post", "category", %w(abe mus hest), {}, { required: true })
886-
)
887+
expected = %(<select id="post_category" name="post[category]" required="required"><option value="" label=" "></option>\n<option value="abe">abe</option>\n<option value="mus">mus</option>\n<option value="hest">hest</option></select>)
888+
889+
assert_dom_equal(expected, select("post", "category", %w(abe mus hest), {}, { required: true }))
890+
assert_dom_equal(expected, select("post", "category", %w(abe mus hest), required: true))
887891
end
888892

889893
def test_required_select_with_include_blank_prompt
890-
assert_dom_equal(
891-
%(<select id="post_category" name="post[category]" required="required"><option value="">Select one</option>\n<option value="abe">abe</option>\n<option value="mus">mus</option>\n<option value="hest">hest</option></select>),
892-
select("post", "category", %w(abe mus hest), { include_blank: "Select one" }, { required: true })
893-
)
894+
expected = %(<select id="post_category" name="post[category]" required="required"><option value="">Select one</option>\n<option value="abe">abe</option>\n<option value="mus">mus</option>\n<option value="hest">hest</option></select>)
895+
896+
assert_dom_equal(expected, select("post", "category", %w(abe mus hest), { include_blank: "Select one" }, { required: true }))
897+
assert_dom_equal(expected, select("post", "category", %w(abe mus hest), include_blank: "Select one", required: true))
894898
end
895899

896900
def test_required_select_with_prompt
897-
assert_dom_equal(
898-
%(<select id="post_category" name="post[category]" required="required"><option value="">Select one</option>\n<option value="abe">abe</option>\n<option value="mus">mus</option>\n<option value="hest">hest</option></select>),
899-
select("post", "category", %w(abe mus hest), { prompt: "Select one" }, { required: true })
900-
)
901+
expected = %(<select id="post_category" name="post[category]" required="required"><option value="">Select one</option>\n<option value="abe">abe</option>\n<option value="mus">mus</option>\n<option value="hest">hest</option></select>)
902+
903+
assert_dom_equal(expected, select("post", "category", %w(abe mus hest), { prompt: "Select one" }, { required: true }))
904+
assert_dom_equal(expected, select("post", "category", %w(abe mus hest), prompt: "Select one", required: true))
901905
end
902906

903907
def test_required_select_display_size_equals_to_one
904-
assert_dom_equal(
905-
%(<select id="post_category" name="post[category]" required="required" size="1"><option value="" label=" "></option>\n<option value="abe">abe</option>\n<option value="mus">mus</option>\n<option value="hest">hest</option></select>),
906-
select("post", "category", %w(abe mus hest), {}, { required: true, size: 1 })
907-
)
908+
expected = %(<select id="post_category" name="post[category]" required="required" size="1"><option value="" label=" "></option>\n<option value="abe">abe</option>\n<option value="mus">mus</option>\n<option value="hest">hest</option></select>)
909+
910+
assert_dom_equal(expected, select("post", "category", %w(abe mus hest), {}, { required: true, size: 1 }))
911+
assert_dom_equal(expected, select("post", "category", %w(abe mus hest), required: true, size: 1))
908912
end
909913

910914
def test_required_select_with_display_size_bigger_than_one
911-
assert_dom_equal(
912-
%(<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>),
913-
select("post", "category", %w(abe mus hest), {}, { required: true, size: 2 })
914-
)
915+
expected = %(<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>)
916+
917+
assert_dom_equal(expected, select("post", "category", %w(abe mus hest), {}, { required: true, size: 2 }))
918+
assert_dom_equal(expected, select("post", "category", %w(abe mus hest), required: true, size: 2))
915919
end
916920

917921
def test_required_select_with_multiple_option
918-
assert_dom_equal(
919-
%(<input name="post[category][]" type="hidden" value="" autocomplete="off"/><select id="post_category" multiple="multiple" name="post[category][]" required="required"><option value="abe">abe</option>\n<option value="mus">mus</option>\n<option value="hest">hest</option></select>),
920-
select("post", "category", %w(abe mus hest), {}, { required: true, multiple: true })
921-
)
922+
expected = %(<input name="post[category][]" type="hidden" value="" autocomplete="off"/><select id="post_category" multiple="multiple" name="post[category][]" required="required"><option value="abe">abe</option>\n<option value="mus">mus</option>\n<option value="hest">hest</option></select>)
923+
924+
assert_dom_equal(expected, select("post", "category", %w(abe mus hest), {}, { required: true, multiple: true }))
925+
assert_dom_equal(expected, select("post", "category", %w(abe mus hest), required: true, multiple: true))
922926
end
923927

924928
def test_select_with_integer

0 commit comments

Comments
 (0)