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.

Show source
Register or log in to add new notes.
November 15, 2011 - (v3.1.0)
0 thanks

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. :-)

January 5, 2012 - (>= v3.0.9)
0 thanks

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.