I have a model MyModel
with a serialized attribute a
, describing an array of symbols.
This code works :
<% form_for @my_
if you already have a select_tag
<%= select_tag "filters", options_from_collection_for_select(filter_values, "id", "name", selected_ids), multiple:true, class:"form-control" %>
and wants to replace it with check_box_tag, you will need to implement something like this:
<div class="checkbox-inline">
<%= check_box_tag "filters[]", value.id, selected_ids.include?(value.id), { :multiple => true} %>
<%= value.name %>
</div>
notice the ending brackets on the name which is needed to catch check box results in the same parameter.
When I implemented this, the parameters were of the same format between the select_tag and the check_box_tag
I found a solution, using 'multiple' option that I didn't know.
<% MyModel::AS.each do |a_value| %>
<%= f.check_box(:a, { :multiple => true }, a_value) %>
<% end %>
Result parameters are a little weird, but it should work.
{"my_model" => { "a" => ["0", "a_value1", "0", "a_value2", "0"] }
Edit from @Viren : passing nil
at the end of the function like
<%= f.check_box(:a, { :multiple => true }, a_value, nil) %>
works perfectly.
There is another solution worth mentioning that makes it very easy to insert records into the database if you have a has_and_belongs_to_many
or has_many
through
relationship by using the collection_check_boxes
form helper. See documentation here.
<%= f.collection_check_boxes :mymodel_ids, MyModel::AS, :id, :name do |m| %>
<%= m.check_box %> <%= m.label %>
<% end %>
Then, in the controller we would allow the mymodel_ids
attribute:
params.require(:mymodel).permit(:name, mymodel_ids:[])
We can also set up a model validation to require that at least one of the checkboxes be checked:
validates :mymodel_ids, presence: true
An added benefit of this method is that if you later edit the mymodel
record and uncheck one of the checkboxes, its record will be deleted from the many_to_many
association table on save
.
You can do it like this:
<% MyModel::AS.each do |a_value| %>
<%= f.check_box("a[]", a_value) %>
<% end %>
This will make params come to server as follows
{ :my_model => { :a => [:a_value1, :a_value2] } }