长时间潜伏但尚未发布。尽管经过了数小时的调试,我似乎无法弄清楚为什么我的check_box_tag不会传递数组。基本上我希望复选框行为允许用户选择多个记录,然后使用按钮来中断或重新填充记录。
查看:
<% @medications.each do |medication| %>
<div class="small-4 columns three-column">
<%= link_to medication.drug_name, edit_medication_path(medication), remote: true %>
</div>
<div class="small-3 columns three-column">
<%= link_to medication.duration, edit_medication_path(medication), remote: true %>
</div>
<div class="small-3 columns three-column">
<%= link_to medication.duration_unit, edit_medication_path(medication), remote: true %>
</div>
<div class="small-2 columns three-column">
<%= form_tag(medication_select_path, method: 'put', :id => 'medication-select') do %>
<%= check_box_tag "medications[]", medication.id -%>
<% end %>
</div>
<% end %>
<div class="small-6 columns">
<%= submit_tag "Discontinue", :type => 'submit', :class => 'hollow alert button', :form => 'medication-select', :value => 'Discontinue', method: 'put' %>
</div>
<div class="small-6 columns">
<%= submit_tag "Refill", :type => 'submit', :class => 'hollow create button', :form => 'medication-select', :value => 'Refill', method: 'put' %>
</div>
控制器:
@selected_meds = Medication.find(params[:medications])
当我按下提交按钮后查看终端时,我得到一个只有第一个药物的输出。尽管选择了4条记录,但在参数中列出了。
终端:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"aNWTazi45CLxMA", "medications"=>["44"], "commit"=>"Discontinue"}
在查看来源时,我的输出HTML似乎也是正确的:
<form id="medication-select" action="/medication_select" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="✓" /><input type="hidden" name="_method" value="put" /><input type="hidden" name="authenticity_token" value="DpJ8" />
<input type="checkbox" name="medication_id[]" id="medication_id_" value="44" />
我尝试过多个来源(并尽可能清楚地复制代码),但仍然无法在params ID中出现数组。
http://railscasts.com/episodes/165-edit-multiple?view=asciicast http://apidock.com/rails/ActionView/Helpers/FormTagHelper/check_box_tag
正如从终端输出预期的那样,我得到了对id = 44的药物的预期变化,但如果我用44,46,50的ID检查药物,它只对第一个检查的id执行控制器动作。
我能想到的唯一一件事就是可能拆分我的提交按钮和我的form_tag(但随后用html5表单标签引用它们)会以某种方式改变行为?在此先感谢,我一直在拔我的头发。
编辑:注意到当我选择一个不是列出的第一个框的复选框时(例如,如果第二个复选框的id为46),则不会将id传递给params。所以我认为这会将问题缩小到check_box_tag或我的form_tag,但是,我仍然无法找到为什么这不起作用,特别是因为源代码在浏览器中看起来都是正确的。)
答案 0 :(得分:3)
我想问题在于嵌套表单元素的方式。对于每种药物,您需要创建一个表单,表明您有n种药物形式。
将return value*1/2;
置于循环之外,如下所示:
form
这样,您就会有一个表单,在提交时会使<%= form_tag(medication_select_path, method: 'put', :id => 'medication-select') do %>
<% @medications.each do |medication| %>
<%= check_box_tag "medications[]", medication.id -%>
<% end %>
<% end %>
包含您选择的ID。
答案 1 :(得分:1)
对于那些遇到类似问题的人,我想我已经弄明白了!发布以防万一会帮助像我这样的其他新人!
在编辑form_tag和结束展示位置后,它似乎按预期工作。从我收集的&lt;%end%&gt; tag正在关闭form_tag循环标记,因此只有第一个复选框与form_tag相关联。
我需要做的就是将所有内容包装在form_tag中。
以下是固定代码,希望将来可以帮助其他人!
<%= form_tag(selected_medications_path, method: 'put', :id => 'medication-select') do %>
<% @medications.each do |medication| %>
<div class="small-4 columns three-column">
<%= link_to medication.drug_name, edit_medication_path(medication), remote: true %>
</div>
<div class="small-3 columns three-column">
<%= link_to medication.duration, edit_medication_path(medication), remote: true %>
</div>
<div class="small-3 columns three-column">
<%= link_to medication.duration_unit, edit_medication_path(medication), remote: true %>
</div>
<div class="small-2 columns three-column">
<%= check_box_tag "medications[]", medication.id %>
</div>
<% end %>
<% end %>