17

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_idsparam (Objective ID の配列) は POST アクションにまったく含まれません。このため@task.update_attributes(params[:task])、コントローラーで行うと、タスクの目的のコレクションは更新されません (つまり、チェックボックスがチェックされていないため、タスクには目的が関連付けられていないはずです)。

:objective_idsでは、たとえ空の配列であっても、param が 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 %>

これについての良いレールキャストがあります。ソースコード
を確認することもできます。

于 2012-08-23T10:05:15.037 に答える