Задача. Сделать чекбоксы для формы
Особенности. Множественный выбор, возможность оставить чекбосы пустыми (не выбирая ничего)
<% current_sizes = [] %>
<% current_sizes = JSON.parse @style.sizes.gsub('=>', ':') if @style.sizes %>
# "[\"\", \"B\", \"G\", \"H\"]" => ["", "B", "G", "H"]
# [""] Если не выбраны значения
<%= hidden_field_tag "sizes[]", nil %>
<% @style.sizes.split(",").each do |size| %>
<%= check_box_tag 'sizes[]', size, (true if current_sizes.include?(size)) %>
<% end %>
Code language: Ruby (ruby)
Первая строка.
Сначала получаем текущее значения для чек бокса. Можно инициализировать начальное значение для current_sizes
Что бы не получать ошибку связаную с недопустимостью использования метода sizes для nil
<% current_sizes = [] %>
Code language: HTML, XML (xml)
В моем случае форма передавалась с помощью метода GET если у нас раньше были выбраны значения и мы решили убрать их, то параметер вообще не будет передаваться. Что бы это избежать мы всегда будем передавать nil в скрытом поле
В @style.sizes храниться строка, с помощью метода split(«,») разбиваем ее на массив.
Затем проходимся по каждому элементу в массиве
В вашем случае возможно другая структура данных
В базу данных сохраняется строка sizes: «[\»\», \»B\», \»G\», \»H\»]» , которую мы легко конвертируем хеш, с помощью метода JSON.parse описанном в самом начале.
Этот способ не является идеальным, буду рад если вы поделитись своим решением в комментарии к данной статье
Полезные ссылки
По ссылке ниже в документации так же передается скрытое поле, но в несколько другом формате. Предлагается генерировать скрытое поле для каждого check_box, что бы передовать значения 0 или 1. Как вы понимаете 1 если значение у чекбокса есть, 0 если чекбокс не был выбран
В комментраниях вы так же найдете реализацию множественных чекбоксов. check_box
Вторая ссылка на check_box_tag