Module: ActionView::Helpers::FormOptionsHelper

Includes:
ERB::Util
Included in:
ActionView::Helpers, InstanceTag
Defined in:
lib/action_view/helpers/form_options_helper.rb

Overview

Provides a number of methods for turning different kinds of containers into a set of option tags.

Options

The collection_select, country_select, select, and time_zone_select methods take an options parameter, a hash.

  • :include_blank - set to true or a prompt string if the first option element of the select element is a blank. Useful if there is not a default value required for the select element.

For example,

select("post", "category", Post::CATEGORIES, {:include_blank => true})

could become:

Another common case is a select tag for an belongs_to-associated object.

Example with @post.person_id => 2:

select("post", "person_id", Person.find(:all).collect {|p| [ p.name, p.id ] }, {:include_blank => 'None'})

could become:

  • :prompt - set to true or a prompt string. When the select element doesn't have a value yet, this prepends an option with a generic prompt -- "Please select" -- or the given prompt string.

Example:

select("post", "person_id", Person.find(:all).collect {|p| [ p.name, p.id ] }, {:prompt => 'Select Person'})

could become:

Like the other form helpers, select can accept an :index option to manually set the ID used in the resulting output. Unlike other helpers, select expects this option to be in the html_options parameter.

Example:

select("album[]", "genre", %w[rap rock country], {}, { :index => nil })

becomes:

Constant Summary

Constants included from ERB::Util

ERB::Util::HTML_ESCAPE, ERB::Util::JSON_ESCAPE

Instance Method Summary collapse



132
133
134
# File 'lib/action_view/helpers/form_options_helper.rb', line 132

def collection_select(object, method, collection, value_method, text_method, options = {}, html_options = {})
  InstanceTag.new(object, method, self, options.delete(:object)).to_collection_select_tag(collection, value_method, text_method, options, html_options)
end

#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 tags, like options_from_collection_for_select, but groups them by tags based on the object relationships of the arguments.

Parameters:

  • collection - An array of objects representing the tags.
  • group_method - The name of a method which, when called on a member of collection, returns an array of child objects representing the 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 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 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 tag.
  • selected_key - A value equal to the value attribute for one of the 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 and tags are returned, so you still have to wrap the output in an appropriate

This can be used to provide a default set of options in the standard way: before rendering the create form, a new model instance is assigned the default options and bound to @model_name. Usually this model is not saved to the database. Instead, a second model object is created when the create request is received. This allows the user to submit a form page more than once with the expected results of creating multiple records. In addition, this allows a single partial to be used to generate form inputs for both edit and create forms.

By default, post.person_id is the selected option. Specify :selected => value to use a different selection or :selected => nil to leave all options unselected.



98
99
100
# File 'lib/action_view/helpers/form_options_helper.rb', line 98

def select(object, method, choices, options = {}, html_options = {})
  InstanceTag.new(object, method, self, options.delete(:object)).to_select_tag(choices, options, html_options)
end

#time_zone_options_for_select(selected = nil, priority_zones = nil, model = ::ActiveSupport::TimeZone) ⇒ Object

Returns a string of option tags for pretty much any time zone in the world. Supply a TimeZone name as selected to have it marked as the selected option tag. You can also supply an array of TimeZone objects as priority_zones, so that they will be listed above the rest of the (long) list. (You can use TimeZone.us_zones as a convenience for obtaining a list of the US time zones, or a Regexp to select the zones of your choice)

The selected parameter must be either nil, or a string that names a TimeZone.

By default, model is the TimeZone constant (which can be obtained in Active Record as a value object). The only requirement is that the model parameter be an object that responds to all, and returns an array of objects that represent time zones.

NOTE: Only the option tags are returned, you have to wrap this call in a regular HTML select tag.



290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
# File 'lib/action_view/helpers/form_options_helper.rb', line 290

def time_zone_options_for_select(selected = nil, priority_zones = nil, model = ::ActiveSupport::TimeZone)
  zone_options = ""

  zones = model.all
  convert_zones = lambda { |list| list.map { |z| [ z.to_s, z.name ] } }

  if priority_zones
   if priority_zones.is_a?(Regexp)
      priority_zones = model.all.find_all {|z| z =~ priority_zones}
   end
    zone_options += options_for_select(convert_zones[priority_zones], selected)
    zone_options += "<option value=\"\" disabled=\"disabled\">-------------</option>\n"

    zones = zones.reject { |z| priority_zones.include?( z ) }
  end

  zone_options += options_for_select(convert_zones[zones], selected)
  zone_options
end

#time_zone_select(object, method, priority_zones = nil, options = {}, html_options = {}) ⇒ Object

Return select and option tags for the given object and method, using #time_zone_options_for_select to generate the list of option tags.

In addition to the :include_blank option documented above, this method also supports a :model option, which defaults to TimeZone. This may be used by users to specify a different time zone model object. (See time_zone_options_for_select for more information.)

You can also supply an array of TimeZone objects as priority_zones, so that they will be listed above the rest of the (long) list. (You can use TimeZone.us_zones as a convenience for obtaining a list of the US time zones, or a Regexp to select the zones of your choice)

Finally, this method supports a :default option, which selects a default TimeZone if the object's time zone is nil.

Examples:

time_zone_select( "user", "time_zone", nil, :include_blank => true)

time_zone_select( "user", "time_zone", nil, :default => "Pacific Time (US & Canada)" )

time_zone_select( "user", 'time_zone', TimeZone.us_zones, :default => "Pacific Time (US & Canada)")

time_zone_select( "user", 'time_zone', [ TimeZone['Alaska'], TimeZone['Hawaii'] ])

time_zone_select( "user", 'time_zone', /Australia/)

time_zone_select( "user", "time_zone", TZInfo::Timezone.all.sort, :model => TZInfo::Timezone)


166
167
168
# File 'lib/action_view/helpers/form_options_helper.rb', line 166

def time_zone_select(object, method, priority_zones = nil, options = {}, html_options = {})
  InstanceTag.new(object, method, self,  options.delete(:object)).to_time_zone_select_tag(priority_zones, options, html_options)
end