Method: ActionView::Helpers::FormOptionsHelper#select
- Defined in:
- actionview/lib/action_view/helpers/form_options_helper.rb
#select(object, method, choices = nil, options = {}, html_options = {}, &block) ⇒ Object
Create a select tag and a series of contained option tags for the provided object and method. The option currently held by the object will be selected, provided that the object is available.
There are two possible formats for the choices
parameter, corresponding to other helpers’ output:
-
A flat collection (see
options_for_select
). -
A nested collection (see
grouped_options_for_select
).
For example:
select("post", "person_id", Person.all.collect {|p| [ p.name, p.id ] }, { include_blank: true })
would become:
<select name="post[person_id]">
<option value=""></option>
<option value="1" selected="selected">David</option>
<option value="2">Sam</option>
<option value="3">Tobias</option>
</select>
assuming the associated person has ID 1.
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. Similarly, you can specify values to be disabled in the option tags by specifying the :disabled
option. This can either be a single value or an array of values to be disabled.
A block can be passed to select
to customize how the options tags will be rendered. This is useful when the options tag has complex attributes.
select(report, "campaign_ids") do
available_campaigns.each do |c|
content_tag(:option, c.name, value: c.id, data: { tags: c..to_json })
end
end
Gotcha
The HTML specification says when multiple
parameter passed to select and all options got deselected web browsers do not send any value to server. Unfortunately this introduces a gotcha: if an User
model has many roles
and have role_ids
accessor, and in the form that edits roles of the user the user deselects all roles from role_ids
multiple select box, no role_ids
parameter is sent. So, any mass-assignment idiom like
@user.update(params[:user])
wouldn’t update roles.
To prevent this the helper generates an auxiliary hidden field before every multiple select. The hidden field has the same name as multiple select and blank value.
Note: The client either sends only the hidden field (representing the deselected multiple select box), or both fields. This means that the resulting array always contains a blank string.
In case if you don’t want the helper to generate this hidden field you can specify include_hidden: false
option.
162 163 164 |
# File 'actionview/lib/action_view/helpers/form_options_helper.rb', line 162 def select(object, method, choices = nil, = {}, = {}, &block) Tags::Select.new(object, method, self, choices, , , &block).render end |