2012-08-23 9 views
11

私はObjectiveモデルと多対多の関係で結合されたTaskモデルを持っています。Railsフォーム - チェックボックスがチェックされていない場合、POSTにparamは含まれていません

私は、ユーザーが任意の目標とタスクをチェックボックスで関連付けることができるタスク編集フォームを持っています。チェックボックスをオンにすると、タスクと特定の目的との関連性が示されます。チェックボックスがチェックされていない場合、関連がないはずです。これは、フォームが送信されるときにデータベースに保持される必要があります。タスクの更新

<%= 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つのチェックボックスは、ユーザーによってチェックされているが、ユーザが任意のチェックボックスをチェックしていない場合、(客観IDの配列である):objective_idsのparamとして絶対に罰金を動作するようですPOSTアクションにはまったく含まれていません。このため、コントローラー内で@task.update_attributes(params[:task])を実行すると、タスクのオブジェクトのコレクションは更新されません(チェックボックスがチェックされていないため、タスクに関連付けられた目的がなくなります)。

したがって、空の配列としてのみ、:objective_idsのパラメータがPOSTに含まれていることを確認するにはどうすればよいですか?

答えて

23

すべてのチェックボックスの上に非表示のフィールドを空の値で追加します。ユーザーがチェックボックスをチェックしなかった場合に送信されます。

<%= 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もチェックしてください。

+0

ありがとうございました。魅力を発揮します。 –

+2

もう1つの解決策はこちらです:http://asciicasts.com/episodes/17-habtm-checkboxes –

+0

@Jignesh、それは私の答えです; – cutalion