Rails form_tag 和 check_box_tag 数组用于选定对象的集合

Mat*_*t H 5 checkbox ruby-on-rails

潜伏很久了,但还没发帖。尽管经过数小时的调试,我似乎无法弄清楚为什么我的 check_box_tag 不会传递数组。本质上,我希望复选框行为允许用户选择多个记录,然后使用按钮停止或重新填充记录。

\n\n

看法:

\n\n
<% @medications.each do |medication| %>     \n  <div class="small-4 columns three-column">    \n    <%= link_to medication.drug_name, edit_medication_path(medication), remote: true  %>            \n  </div>\n  <div class="small-3 columns three-column">\n    <%= link_to medication.duration, edit_medication_path(medication), remote: true %>\n  </div>\n  <div class="small-3 columns three-column">\n    <%= link_to medication.duration_unit, edit_medication_path(medication), remote: true %>\n  </div>\n  <div class="small-2 columns three-column"> \n    <%= form_tag(medication_select_path, method: \'put\', :id => \'medication-select\') do %>\n      <%= check_box_tag "medications[]", medication.id  -%>\n    <% end %>\n  </div>\n<% end %>\n\n<div class="small-6 columns">\n  <%= submit_tag "Discontinue", :type => \'submit\', :class => \'hollow alert button\', :form => \'medication-select\', :value => \'Discontinue\', method: \'put\' %>\n</div>\n<div class="small-6 columns">\n  <%= submit_tag "Refill", :type => \'submit\', :class => \'hollow create button\', :form => \'medication-select\', :value => \'Refill\', method: \'put\' %>\n</div>\n
Run Code Online (Sandbox Code Playgroud)\n\n

控制器:

\n\n
@selected_meds = Medication.find(params[:medications])\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我按下提交按钮后查看终端时,尽管选择了 4 条记录,但我得到的输出仅包含参数中列出的第一个medication.id。

\n\n

终端:

\n\n
Parameters: {"utf8"=>"\xe2\x9c\x93", "authenticity_token"=>"aNWTazi45CLxMA", "medications"=>["44"], "commit"=>"Discontinue"}\n
Run Code Online (Sandbox Code Playgroud)\n\n

查看源代码时,我的输出 HTML 似乎是正确的:

\n\n
<form id="medication-select" action="/medication_select" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="_method" value="put" /><input type="hidden" name="authenticity_token" value="DpJ8" />\n<input type="checkbox" name="medication_id[]" id="medication_id_" value="44" />\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n

我已经尝试了多个来源(并尽可能清晰地复制了代码),但仍然无法在 params ids 中获取数组。

\n\n

http://railscasts.com/episodes/165-edit-multiple?view=asciicast \n http://apidock.com/rails/ActionView/Helpers/FormTagHelper/check_box_tag

\n\n

正如终端输出所预期的那样,我得到了 id=44 的药物的预期更改,但如果我检查 id 为 44、46、50 的药物,它只会对第一个检查的 id 执行控制器操作。

\n\n

我唯一能想到的是,也许分开我的提交按钮和我的 form_tag (但然后用 html5 表单标签引用它们)会以某种方式改变行为?提前致谢,我一直在为这个而烦恼。

\n\n

编辑:请注意,当我选择一个不是列出的第一个复选框的复选框时(例如,如果第二个复选框的 id 为 46),则不会将 id 传递到参数中。因此,我认为这将问题范围缩小到了 check_box_tag 或我的 form_tag,但是,我仍然找不到为什么这不起作用,特别是当源代码在浏览器中显示正确时)。

\n

Aru*_*han 6

我想问题出在您嵌套表单元素的方式上。对于每种药物,您创建一个表格,这意味着您有 n 个药物的 n 个表格。

form像这样取出循环外部:

<%= form_tag(medication_select_path, method: 'put', :id => 'medication-select') do %>
  <% @medications.each do |medication| %>
    <%= check_box_tag "medications[]", medication.id  -%>
  <% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

这样,您就拥有了一个表单,提交后params[:medications]该表单将包含您选择的 ID。