I have a model MyModel
with a serialized attribute a
, describing an array of symbols.
This code works :
<% form_for @my_model do |f| %>
<%= f.select :a, MyModel::AS, :multiple => true) %>
<% end %>
The parameters are correct :
{ :my_model => { :a => [:a_value1, :a_value2] } }
I want to transform this multiple select into a set of checkboxes, like this :
<% form_for @my_model do |f| %>
<% MyModel::AS.each do |a_value|
<%= f.check_box(:a_value) %>
<% end %>
<% end %>
It works too, but the parameters are not the same at all :
{ :my_model => { :a_value1 => 1, :a_value2 => 1 } }
I think of 2 solutions to return to the first solution...
check_box
into check_box_tag
, replace multiple select, and add some javascript to 'check' select values when user clic on check_box_tags. Then, the parameter will be the same directly in the controller.What solution is the less ugly ? Or is there any other one ?
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
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With