2012-08-23 52 views
11

我有一個Task模型,它與Objective模型以多對多關係連接。Rails窗體 - 當沒有選中複選框時,參數不包含在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 PARAM(其爲目標ID數組)根本不包含在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

一個更多的解決方案在這裏:http://asciicasts.com/episodes/17-habtm-checkboxes –

+0

@ jignesh,它在我的答案;) – cutalion

相關問題