Вернуть массив с помощью form_with?

На мой взгляд, у меня есть несколько флажков, и я хочу отправить обратно массив, который отмечен. Я добился этого, написав сам HTML, но мне интересно, есть ли способ сделать это, используяFormBuilder#check_box.

Что у меня работает

<%= form_with model: @dog, local: true do |my_form| %>
  <label>
    <input type="checkbox"
           name="dog[breeds][]"
           value="labrador">
    Labrador
  </label>
  <label>
    <input type="checkbox"
           name="dog[breeds][]"
           value="husky">
    Husky
  </label>
    <%= my_form.submit 'Save' %>
<% end %>

Это отлично работает: paramsсодержать то, что я ожидаю. Если я поставлю галочку в поле "хаски" и отправлю, массив "породы" будет содержать "хаски":

"dog"=>{"breeds"=>["husky"]}

Но я хочу знать, есть ли способ использовать my_form.check_box для этого вместо того, чтобы самому писать чекбокс HTML.

Для чего я пробовал FormBuilder#check_box

<%= form_with model: @dog, local: true do |my_form| %>
  <label>
    <%= my_form.check_box 'breeds[]', value: 'labrador'%>
    Labrador
  </label>
  <label>
    <%= my_form.check_box 'breeds[]', value: 'husky'%>
    Husky
  </label>
  <%= my_form.submit 'Save' %>
<% end %>

Это не соответствует моим ожиданиям. вparams, независимо от того, какие поля я проверяю, массив breeds всегда пуст:

"dog"=>{"breeds"=>[]}

Есть ли способ использовать FormBuilder помощники в том, что я пытаюсь сделать?

Вроде бы там должно быть, но нигде не нашел.

1 ответ

Решение

У вас должно получиться так:

<%= form_with model: @dog, local: true do |my_form| %>
  <% ['labrador','husky'].each do |breed| %>
      <%= my_form.check_box :breeds, {multiple: true}, breed%>
      <%= my_form.label :breeds, breed.titleize %>
  <%end%>
  <%= my_form.submit 'Save' %>
<% end %>

Подпись для check_box является (object_name, method, options = {}, checked_value = "1", unchecked_value = "0").

Поскольку вы используете конструктор форм, object_name можно опустить, так как это будет my_form.

Итак, проходим:

  • метод :breeds,
  • в options {multiple: true} так что он создает коллекцию
  • в checked_value будет название породы.

ActionView::Helpers::FormHelper#check_box Документация

Другие вопросы по тегам