Rails表单 - 如果未选中复选框,则POST中不包含param

时间:2012-08-23 04:49:24

标签: ruby-on-rails forms rest activerecord post

我有一个Task模型,它与Objective模型以多对多的关系加入。

我有一个任务编辑表单,用户可以通过复选框将任何目标与任务相关联。选中复选框时,它应指示任务与特定目标之间的关联;如果未选中复选框,则应该没有关联。这应该在表单提交时保留到数据库中。

<%= form_for @task do |f| %>
  <% Objective.all.each do |objective| %>
    <%= check_box_tag :objective_ids, objective.id, @task.objectives.include?(objective), :name => 'task[objective_ids][]' %>
  <% end %>
  <%= f.button :submit %>
<% end %>

只要用户检查了一个复选框,更新任务似乎就可以正常工作,但是当用户没有选中任何复选框时,:objective_ids param(这是一个目标ids数组)根本不包含在POST操作中。因此,当我在控制器中执行@task.update_attributes(params[:task])时,任务的目标集合不会更新(即任务不应该有任何与之关联的目标,因为没有选中复选框)。

那么如何确保POST中包含:objective_ids param,即使只作为空数组?

1 个答案:

答案 0 :(得分:26)

在所有带空值的复选框上添加隐藏字段。如果用户没有选中任何复选框,它将被发送。

<%= form_for @task do |f| %>
  <%= hidden_field_tag "task[objective_ids][]", nil %>
  <% Objective.all.each do |objective| %>
    <%= check_box_tag :objective_ids, objective.id, @task.objectives.include?(objective), :name => 'task[objective_ids][]' %>
  <% end %>
  <%= f.button :submit %>
<% end %>

关于此,这是一个很好的railscasts 您可能还想查看source code