Class: Formtastic::Inputs::SelectInput
- Inherits:
-
Object
- Object
- Formtastic::Inputs::SelectInput
- Includes:
- Base, Base::Collections
- 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 an
:integer
and there is an enum defined (enum
) - 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_select
,:time_select
or:datetime_select
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).
For select inputs that map to ActiveRecord enum
attributes, Formtastic will automatically
load in your enum options to be used as the select's options. This can be overridden with
the :collection
option, or augmented with I18n translations. See examples below.
An error is raised if you try to render a multi-select with an enum, as ActiveRecord can
only store one choice in the database.
Instance Attribute Summary
Attributes included from Base
#builder, #method, #object, #object_name, #options, #template
Instance Method Summary collapse
- #extra_input_html_options ⇒ Object
- #include_blank ⇒ Object
-
#initialize(*args) ⇒ SelectInput
constructor
A new instance of SelectInput.
- #input_html_options ⇒ Object
- #input_html_options_name ⇒ Object
- #input_html_options_name_multiple ⇒ Object
- #input_options ⇒ Object
- #label_html_options ⇒ Object
- #multiple? ⇒ Boolean
- #multiple_by_association? ⇒ Boolean
- #multiple_by_options? ⇒ Boolean
- #prompt? ⇒ Boolean
- #select_html ⇒ Object
- #single? ⇒ Boolean
- #to_html ⇒ Object
Methods included from Base::Collections
#collection, #collection_for_boolean, #collection_from_association, #collection_from_enum, #collection_from_enum?, #collection_from_options, #label_and_value_method, #label_and_value_method_from_collection, #label_method, #label_method_from_options, #raw_collection, #send_or_call, #send_or_call_or_object, #value_method, #value_method_from_options
Methods included from Base
#removed_option!, #warn_and_correct_option!, #warn_deprecated_option!
Methods included from Base::Wrapping
#input_wrapping, #wrapper_classes, #wrapper_classes_raw, #wrapper_dom_id, #wrapper_html_options, #wrapper_html_options_raw
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 LocalizedString
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?, #readonly?, #readonly_attribute?, #readonly_from_options?, #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
Constructor Details
#initialize(*args) ⇒ SelectInput
Returns a new instance of SelectInput.
161 162 163 164 |
# File 'lib/formtastic/inputs/select_input.rb', line 161 def initialize(*args) super raise Formtastic::UnsupportedEnumCollection if collection_from_enum? && multiple? end |
Instance Method Details
#extra_input_html_options ⇒ Object
197 198 199 200 201 202 203 204 |
# File 'lib/formtastic/inputs/select_input.rb', line 197 def { :multiple => multiple?, :name => multiple? ? : } end |
#include_blank ⇒ Object
177 178 179 |
# File 'lib/formtastic/inputs/select_input.rb', line 177 def include_blank .key?(:include_blank) ? [:include_blank] : (single? && builder.include_blank_for_select_by_default) end |
#input_html_options ⇒ Object
193 194 195 |
# File 'lib/formtastic/inputs/select_input.rb', line 193 def .merge(super.reject {|k,v| k==:name && v.nil?} ) end |
#input_html_options_name ⇒ Object
206 207 208 209 210 211 212 |
# File 'lib/formtastic/inputs/select_input.rb', line 206 def if builder..key?(:index) "#{object_name}[#{builder.[:index]}][#{association_primary_key}]" else "#{object_name}[#{association_primary_key}]" end end |
#input_html_options_name_multiple ⇒ Object
214 215 216 |
# File 'lib/formtastic/inputs/select_input.rb', line 214 def + "[]" end |
#input_options ⇒ Object
189 190 191 |
# File 'lib/formtastic/inputs/select_input.rb', line 189 def super.merge :include_blank => (include_blank unless prompt?) end |
#label_html_options ⇒ Object
185 186 187 |
# File 'lib/formtastic/inputs/select_input.rb', line 185 def super.merge(:for => [:id]) end |
#multiple? ⇒ Boolean
226 227 228 |
# File 'lib/formtastic/inputs/select_input.rb', line 226 def multiple? || multiple_by_association? end |
#multiple_by_association? ⇒ Boolean
218 219 220 |
# File 'lib/formtastic/inputs/select_input.rb', line 218 def multiple_by_association? reflection && [ :has_many, :has_and_belongs_to_many ].include?(reflection.macro) end |
#multiple_by_options? ⇒ Boolean
222 223 224 |
# File 'lib/formtastic/inputs/select_input.rb', line 222 def [:multiple] || ([:input_html] && [:input_html][:multiple]) end |
#prompt? ⇒ Boolean
181 182 183 |
# File 'lib/formtastic/inputs/select_input.rb', line 181 def prompt? !![:prompt] end |
#select_html ⇒ Object
173 174 175 |
# File 'lib/formtastic/inputs/select_input.rb', line 173 def select_html builder.select(input_name, collection, , ) end |
#single? ⇒ Boolean
230 231 232 |
# File 'lib/formtastic/inputs/select_input.rb', line 230 def single? !multiple? end |
#to_html ⇒ Object
166 167 168 169 170 171 |
# File 'lib/formtastic/inputs/select_input.rb', line 166 def to_html input_wrapping do label_html << select_html end end |