17

我有一个任务模型,它与一个目标模型以多对多的关系加入。

我有一个任务编辑表单,用户可以通过复选框将任何目标与任务相关联。当一个复选框被选中时,它应该表明任务和特定目标之间的关联;当未选中复选框时,不应该有关联。当表单提交时,这应该被持久化到数据库中。

<%= 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参数(这是一个目标 id 的数组)根本不包含在 POST 操作中。因此,当我@task.update_attributes(params[:task])在控制器中执行此操作时,任务的目标集合没有更新(即任务不应再有任何与之关联的目标,因为没有选中复选框)。

那么如何确保:objective_ids参数包含在 POST 中,即使只是作为一个空数组?

4

1 回答 1

31

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

<%= 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
您可能还想检查它的源代码

于 2012-08-23T10:05:15.037 回答