我有一个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,即使只作为空数组?
答案 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。