Вернуть массив с помощью 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
будет название породы.