method

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.