Objective モデルと多対多の関係で結合された Task モデルがあります。
ユーザーがチェックボックスを介して目的をタスクに関連付けることができるタスク編集フォームがあります。チェックボックスがチェックされている場合、タスクと特定の目的の間の関連付けを示す必要があります。チェックボックスがチェックされていない場合、関連付けはありません。これは、フォームの送信時にデータベースに永続化する必要があります。
<%= 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 %>
タスクの更新は、ユーザーが 1 つのチェックボックスをオンにしている限り問題なく動作するように見えますが、ユーザーがチェックボックスをまったくオンにしない場合、:objective_ids
param (Objective ID の配列) は POST アクションにまったく含まれません。このため@task.update_attributes(params[:task])
、コントローラーで行うと、タスクの目的のコレクションは更新されません (つまり、チェックボックスがチェックされていないため、タスクには目的が関連付けられていないはずです)。
:objective_ids
では、たとえ空の配列であっても、param が POST に含まれていることを確認するにはどうすればよいでしょうか?