option_groups_from_collection_for_select
option_groups_from_collection_for_select(collection, group_method, group_label_method, option_key_method, option_value_method, selected_key = nil)
public
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 of collection, 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 the label attribute for its <optgroup> tag |
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 <option> tag |
option_value_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 contents of its <option> tag |
selected_key: | A value equal to the value attribute for one of the <option> tags, which will have the selected attribute set. Corresponds to the return value of one of the calls to option_key_method. If nil, no selection is made. |
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.
Wrapping with select tag
I didn’t knew how to wrap the output with <select> tag. I didn’t want to use raw html, but the doc doesn’t mention another way.
So, here is what I tried and it’s working:
<%= f.select :entry, option_groups_from_collection_for_select(@categories, :entries, :name, :id, :name) %>
I hope this helps anyone. :-)
How to include a “Please select…” (default/prompt) in a grouped dropdown list.
The clue here is that you actually specify the prompt on the select element, and not in the option_groups_from_collection_for_select element.
<%= f.select :post_type_id, option_groups_from_collection_for_select(@categories, :post_types, :name, :id, :name), :include_blank => "Please select..." %>
Hope this helps someone.