Return 使用“form_with”的数组?

Return an array using `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 包含我所期望的内容。如果我选中 "husky" 框并提交,"breeds" 数组包含 "husky":

"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 助手来完成我想做的事情?

好像真的应该有,但是一直找不到。

您应该可以这样做:

<%= 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 Documentation