mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Allow the use of callable objects as group methods for grouped selects.
Replaced the uses of `group.send(...)` in `option_groups_from_collection_for_select` by calls to `value_for_collection(group, ...)`, allowing the use of procs, lambdas and other callable objects as parameters.
This commit is contained in:
parent
b852ef2660
commit
0d73056436
3 changed files with 34 additions and 4 deletions
|
@ -1,3 +1,11 @@
|
|||
* Allow the use of callable objects as group methods for grouped selects.
|
||||
|
||||
Until now, the `option_groups_from_collection_for_select` method was only able to
|
||||
handle method names as `group_method` and `group_label_method` parameters,
|
||||
it is now able to receive procs and other callable objects too.
|
||||
|
||||
*Jérémie Bonal*
|
||||
|
||||
* Add `preload_link_tag` helper
|
||||
|
||||
This helper that allows to the browser to initiate early fetch of resources
|
||||
|
|
|
@ -214,9 +214,15 @@ module ActionView
|
|||
# * +method+ - The attribute of +object+ corresponding to the select tag
|
||||
# * +collection+ - An array of objects representing the <tt><optgroup></tt> tags.
|
||||
# * +group_method+ - The name of a method which, when called on a member of +collection+, returns an
|
||||
# array of child objects representing the <tt><option></tt> tags.
|
||||
# array of child objects representing the <tt><option></tt> tags. It can also be any object that responds
|
||||
# to +call+, such as a +proc+, that will be called for each member of the +collection+ to retrieve the
|
||||
# value.
|
||||
|
||||
# * +group_label_method+ - The name of a method which, when called on a member of +collection+, returns a
|
||||
# string to be used as the +label+ attribute for its <tt><optgroup></tt> tag.
|
||||
# string to be used as the +label+ attribute for its <tt><optgroup></tt> tag. It can also be any object
|
||||
# that responds to +call+, such as a +proc+, that will be called for each member of the +collection+ to
|
||||
# retrieve the label.
|
||||
|
||||
# * +option_key_method+ - The name of a method which, when called on a child object of a member of
|
||||
# +collection+, returns a value to be used as the +value+ attribute for its <tt><option></tt> tag.
|
||||
# * +option_value_method+ - The name of a method which, when called on a child object of a member of
|
||||
|
@ -457,9 +463,9 @@ module ActionView
|
|||
def option_groups_from_collection_for_select(collection, group_method, group_label_method, option_key_method, option_value_method, selected_key = nil)
|
||||
collection.map do |group|
|
||||
option_tags = options_from_collection_for_select(
|
||||
group.send(group_method), option_key_method, option_value_method, selected_key)
|
||||
value_for_collection(group, group_method), option_key_method, option_value_method, selected_key)
|
||||
|
||||
content_tag("optgroup".freeze, option_tags, label: group.send(group_label_method))
|
||||
content_tag("optgroup".freeze, option_tags, label: value_for_collection(group, group_label_method))
|
||||
end.join.html_safe
|
||||
end
|
||||
|
||||
|
|
|
@ -337,6 +337,22 @@ class FormOptionsHelperTest < ActionView::TestCase
|
|||
)
|
||||
end
|
||||
|
||||
def test_option_groups_from_collection_for_select_with_callable_group_method
|
||||
group_proc = Proc.new { |c| c.countries }
|
||||
assert_dom_equal(
|
||||
"<optgroup label=\"<Africa>\"><option value=\"<sa>\"><South Africa></option>\n<option value=\"so\">Somalia</option></optgroup><optgroup label=\"Europe\"><option value=\"dk\" selected=\"selected\">Denmark</option>\n<option value=\"ie\">Ireland</option></optgroup>",
|
||||
option_groups_from_collection_for_select(dummy_continents, group_proc, "continent_name", "country_id", "country_name", "dk")
|
||||
)
|
||||
end
|
||||
|
||||
def test_option_groups_from_collection_for_select_with_callable_group_label_method
|
||||
label_proc = Proc.new { |c| c.continent_name }
|
||||
assert_dom_equal(
|
||||
"<optgroup label=\"<Africa>\"><option value=\"<sa>\"><South Africa></option>\n<option value=\"so\">Somalia</option></optgroup><optgroup label=\"Europe\"><option value=\"dk\" selected=\"selected\">Denmark</option>\n<option value=\"ie\">Ireland</option></optgroup>",
|
||||
option_groups_from_collection_for_select(dummy_continents, "countries", label_proc, "country_id", "country_name", "dk")
|
||||
)
|
||||
end
|
||||
|
||||
def test_option_groups_from_collection_for_select_returns_html_safe_string
|
||||
assert option_groups_from_collection_for_select(dummy_continents, "countries", "continent_name", "country_id", "country_name", "dk").html_safe?
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue