Method: ActionView::Helpers::FormOptionsHelper#option_groups_from_collection_for_select
- Defined in:
- lib/action_view/helpers/form_options_helper.rb
#option_groups_from_collection_for_select(collection, group_method, group_label_method, option_key_method, option_value_method, selected_key = nil) ⇒ Object
Returns a string of <option> tags, like options_from_collection_for_select, but groups them by <optgroup> tags based on the object relationships of the arguments.
Parameters:
-
collection- An array of objects representing the<optgroup>tags. -
group_method- The name of a method which, when called on a member ofcollection, returns an array of child objects representing the<option>tags. -
group_label_method+ - The name of a method which, when called on a member of
collection, returns a string to be used as thelabelattribute for its<optgroup>tag. -
option_key_method- The name of a method which, when called on a child object of a member ofcollection, returns a value to be used as thevalueattribute for its<option>tag. -
option_value_method- The name of a method which, when called on a child object of a member ofcollection, returns a value to be used as the contents of its<option>tag. -
selected_key- A value equal to thevalueattribute for one of the<option>tags, which will have theselectedattribute set. Corresponds to the return value of one of the calls tooption_key_method. Ifnil, no selection is made. Can also be a hash if disabled values are to be specified.
Example object structure for use with this method:
class Continent < ActiveRecord::Base
has_many :countries
# attribs: id, name
end
class Country < ActiveRecord::Base
belongs_to :continent
# attribs: id, name, continent_id
end
Sample usage:
option_groups_from_collection_for_select(@continents, :countries, :name, :id, :name, 3)
Possible output:
<optgroup label="Africa">
<option value="1">Egypt</option>
<option value="4">Rwanda</option>
...
</optgroup>
<optgroup label="Asia">
<option value="3" selected="selected">China</option>
<option value="12">India</option>
<option value="5">Japan</option>
...
</optgroup>
Note: Only the <optgroup> and <option> tags are returned, so you still have to wrap the output in an appropriate <select> tag.
397 398 399 400 401 402 403 404 |
# File 'lib/action_view/helpers/form_options_helper.rb', line 397 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| group_label_string = eval("group.#{group_label_method}") "<optgroup label=\"#{html_escape(group_label_string)}\">" + (eval("group.#{group_method}"), option_key_method, option_value_method, selected_key) + '</optgroup>' end.join.html_safe end |