Class: Formtastic::Inputs::SelectInput
- Inherits:
-
Object
- Object
- Formtastic::Inputs::SelectInput
- Includes:
- Base, Base::Collections, Base::GroupedCollections
- Defined in:
- lib/formtastic/inputs/select_input.rb
Overview
Do/can we support the per-item HTML options like RadioInput?
A select input is used to render a <select>
tag with a series of options to choose from.
It works for both single selections (like a belongs_to
relationship, or "yes/no" boolean),
as well as multiple selections (like a has_and_belongs_to_many
/has_many
relationship,
for assigning many genres to a song, for example).
This is the default input choice when:
- the database column type is an
:integer
and there is an association (belongs_to
) - the database column type is a
:string
and the:collection
option is used - there an object with an association, but no database column on the object (
has_many
, etc) - there is no object and the
:collection
option is used
The flexibility of the :collection
option (see examples) makes the :select input viable as
an alternative for many other input types. For example, instead of...
- a
:string
input (where you want to force the user to choose from a few specific strings rather than entering anything) - a
:boolean
checkbox input (where the user could choose yes or no, rather than checking a box) - a
:date
,:time
or:datetime
input (where the user could choose from pre-selected dates) - a
:number
input (where the user could choose from a set of pre-defined numbers) - a
:time_zone
input (where you want to provide your own set of choices instead of relying on Rails) - a
:country
input (no need for a plugin really)
Within the standard <li>
wrapper, the output is a <label>
tag followed by a <select>
tag containing <option>
tags.
For inputs that map to associations on the object model, Formtastic will automatically load
in a collection of objects on the association as options to choose from. This might be an
Author.all
on a Post
form with an input for a belongs_to :user
association, or a
Tag.all
for a Post
form with an input for a has_and_belongs_to_many :tags
association.
You can override or customise this collection and the <option>
tags it will render through
the :collection
option (see examples).
The way on which Formtastic renders the value
attribute and content of each <option>
tag
is customisable through the :member_label
and :member_value
options. When not provided,
we fall back to a list of methods to try on each object such as :to_label
, :name
and
:to_s
, which are defined in the configurations collection_label_methods
and
collection_value_methods
(see examples below).
Instance Attribute Summary
Attributes included from Base
#builder, #method, #object, #object_name, #options, #template
Instance Method Summary collapse
- #extra_input_html_options ⇒ Object
- #grouped_select_html ⇒ Object
- #include_blank? ⇒ Boolean
- #input_html_options ⇒ Object
- #input_options ⇒ Object
- #label_html_options ⇒ Object
- #multiple? ⇒ Boolean
- #multiple_by_association? ⇒ Boolean
- #multiple_by_options? ⇒ Boolean
- #select_html ⇒ Object
- #single? ⇒ Boolean
- #to_html ⇒ Object
Methods included from Base::GroupedCollections
#group_association, #group_association_from_options, #group_association_from_reflection, #group_by, #group_label_method, #group_label_method_from_grouped_collection, #group_label_method_from_options, #grouped_collection, #raw_grouped_collection
Methods included from Base::Collections
#collection, #collection_for_boolean, #collection_from_association, #collection_from_options, #label_and_value_method, #label_method, #raw_collection, #send_or_call, #send_or_call_or_object, #value_method
Methods included from Base
#initialize, #warn_and_correct_option!
Methods included from Base::Wrapping
#input_wrapping, #wrapper_dom_id, #wrapper_html_options
Methods included from Base::Labelling
#label_from_options, #label_html, #label_text, #localized_label, #render_label?, #requirement_text, #requirement_text_or_proc
Methods included from Base::Associations
#association, #association_primary_key, #belongs_to?, #has_many?, #reflection
Methods included from Base::Fileish
Methods included from Base::Validations
#autofocus?, #column_limit, #limit, #not_required_through_negated_validation!, #not_required_through_negated_validation?, #optional?, #required?, #required_attribute?, #responds_to_global_required?, #validation_integer_only?, #validation_limit, #validation_max, #validation_min, #validation_step, #validations, #validations?, #validator_relevant?
Methods included from Base::Naming
#as, #attributized_method_name, #humanized_method_name, #input_name, #sanitized_method_name, #sanitized_object_name
Methods included from Base::Hints
#hint?, #hint_html, #hint_text, #hint_text_from_options
Methods included from Base::Errors
#error_first_html, #error_html, #error_keys, #error_list_html, #error_none_html, #error_sentence_html, #errors, #errors?
Methods included from Base::Database
Methods included from Base::Options
Methods included from Base::Html
Instance Method Details
#extra_input_html_options ⇒ Object
185 186 187 188 189 190 |
# File 'lib/formtastic/inputs/select_input.rb', line 185 def { :multiple => multiple?, :name => "#{object_name}[#{association_primary_key}]#{'[]' if multiple?}" } end |
#grouped_select_html ⇒ Object
153 154 155 156 157 158 159 160 161 162 163 164 |
# File 'lib/formtastic/inputs/select_input.rb', line 153 def grouped_select_html builder.grouped_collection_select( input_name, grouped_collection, group_association, group_label_method, value_method, label_method, , ) end |
#include_blank? ⇒ Boolean
166 167 168 169 170 171 |
# File 'lib/formtastic/inputs/select_input.rb', line 166 def include_blank? return [:prompt] if .key?(:prompt) return [:include_blank] if .key?(:include_blank) return true if (single? && builder.include_blank_for_select_by_default) false end |
#input_html_options ⇒ Object
181 182 183 |
# File 'lib/formtastic/inputs/select_input.rb', line 181 def .merge(super) end |
#input_options ⇒ Object
177 178 179 |
# File 'lib/formtastic/inputs/select_input.rb', line 177 def super.merge({:include_blank => include_blank?, :prompt => nil}) end |
#label_html_options ⇒ Object
173 174 175 |
# File 'lib/formtastic/inputs/select_input.rb', line 173 def super.merge(:for => [:id]) end |
#multiple? ⇒ Boolean
200 201 202 |
# File 'lib/formtastic/inputs/select_input.rb', line 200 def multiple? || multiple_by_association? end |
#multiple_by_association? ⇒ Boolean
192 193 194 |
# File 'lib/formtastic/inputs/select_input.rb', line 192 def multiple_by_association? reflection && [ :has_many, :has_and_belongs_to_many ].include?(reflection.macro) end |
#multiple_by_options? ⇒ Boolean
196 197 198 |
# File 'lib/formtastic/inputs/select_input.rb', line 196 def [:multiple] || ([:input_html] && [:input_html][:multiple]) end |
#select_html ⇒ Object
149 150 151 |
# File 'lib/formtastic/inputs/select_input.rb', line 149 def select_html builder.select(input_name, collection, , ) end |
#single? ⇒ Boolean
204 205 206 |
# File 'lib/formtastic/inputs/select_input.rb', line 204 def single? !multiple? end |
#to_html ⇒ Object
142 143 144 145 146 147 |
# File 'lib/formtastic/inputs/select_input.rb', line 142 def to_html input_wrapping do label_html << ([:group_by] ? grouped_select_html : select_html) end end |