Любопытно, что такое «рельсовый способ» обработки ситуации, когда пользователь проверяет несколько флажков (с одним и тем же значением имени), и он отправляется обратно в контроллер.
Как бы вы проверили, были ли выбраны несколько элементов, а затем разделены на значения идентификаторов и т. Д.
Самый простой способ сделать это - установить эти флажки в массив.
HTML:
<input type="checkbox" name="tag_ids[]" value="1" /> <input type="checkbox" name="tag_ids[]" value="2" /> <input type="checkbox" name="tag_ids[]" value="3" />
Контроллер:
tag_ids = params[:tag_ids]
(Конечно, вы, вероятно, использовали бы в представлении помощники на основе form_for и, следовательно, массовое присвоение идентификаторов тегов. Это просто наиболее общий пример.)
form_for
f.check_box :tag_ids, {multiple: true}, 1, nil
Правильный ответ:
Вот причина, есть опция «множественное значение: истина», которая позволяет помещать ваши входные данные в массив. Если не указан параметр множественного числа: истина, это не будет разрешено.
В дополнение к ответу Чака Каллеба я понял, что, отправив пустую строку вместо nil или false в качестве непроверенного значения, Rails поймет, как удалить связанные идентификаторы в действии обновления:
nil
false
<%= f.check_box :tag_ids, {multiple: true}, tag.id, '' %>
Вот пример вида и контроллера, например, где несколько уборщиков могут находиться в нескольких городах.
<%= form_for(@cleaner) do |f| %> <p> <%= f.label :cities %><br /> <% for city in City.all %> <%= check_box_tag "cleaner[city_ids][]", city.id, @cleaner.cities.include?(city) %> <%=h city.name %><br /> <% end %> </p> <div class="actions"> <%= f.submit %> </div> <% end %>
И в контроллере
def cleaner_params params.require(:cleaner).permit(city_ids: []) end
Вы можете найти полное руководство по «рельсовому пути», как это сделать https://kolosek.com/rails-join-table/
Если вы хотите использовать параметр checked, вы должны написать это:
checked
check_box_tag "tag_ids[]", 1, true
А не это:
check_box_tag 'tag_ids[]', 1, true
Мне понадобилось время, чтобы выяснить,Надеюсь, это кому-нибудь поможет.