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

Xåp*_* - 16 forms rest post activerecord ruby-on-rails

我有一个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 %>
Run Code Online (Sandbox Code Playgroud)

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

那么我怎样才能确保:objective_idsparam包含在POST中,即使只作为一个空数组?

cut*_*ion 30

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

<%= 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 %>
Run Code Online (Sandbox Code Playgroud)

这是一个关于此的良好的轨道广播.
您可能还想检查它的源代码.

  • 这里还有一个解决方案:http://asciicasts.com/episodes/17-habtm-checkboxes (2认同)