用于收集所选对象的Rails form_tag和check_box_tag数组

时间:2016-07-02 15:38:14

标签: ruby-on-rails checkbox

长时间潜伏但尚未发布。尽管经过了数小时的调试,我似乎无法弄清楚为什么我的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="&#x2713;" /><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,但是,我仍然无法找到为什么这不起作用,特别是因为源代码在浏览器中看起来都是正确的。)

2 个答案:

答案 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 %>