Рельсовые формы. Если флажок не установлен, параметр не включен в POST

У меня есть модель задачи, которая объединена в отношение "многие ко многим" с объектной моделью.

У меня есть форма редактирования задачи, в которой пользователь может связать любой объект с заданием с помощью флажков. Когда флажок установлен, он должен указывать на связь между Задачей и конкретной Целью; когда флажок не установлен, связи не должно быть. Это должно сохраняться в базе данных при отправке формы.

<%= 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 (который представляет собой массив идентификаторов Objective) не включен в действие POST вообще. Из-за этого, когда я делаю @task.update_attributes(params[:task]) в контроллере, коллекция задач Целей не обновляется (т.е. У задачи больше не должно быть никаких связанных с ней Целей, поскольку флажки не были отмечены).

Итак, как я могу гарантировать, что параметр :objective_ids включен в POST, даже если только в качестве пустого массива?

Ответ 1

Добавить скрытое поле, прежде всего, флажки с пустым значением. Он будет отправлен в случае, если пользователь не установил флажки.

<%= 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 об этом.
Вы также можете проверить исходный код.