Display a checkbox list instead of multiple select

后端 未结 4 1329
失恋的感觉
失恋的感觉 2020-12-29 11:31

I have a model MyModel with a serialized attribute a, describing an array of symbols.

This code works :

<% form_for @my_         


        
相关标签:
4条回答
  • 2020-12-29 11:36

    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

    0 讨论(0)
  • 2020-12-29 11:54

    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.

    0 讨论(0)
  • 2020-12-29 11:56

    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.

    0 讨论(0)
  • 2020-12-29 11:56

    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] } }
    
    0 讨论(0)
提交回复
热议问题