2011-10-06 30 views
0

我有一個窗體顯示任務是否完成。您可以選中該框來將模型的:is_complete屬性設置爲true,然後再次檢查以將其設置爲false。或者這就是它應該如何工作。我可以將任務標記爲完成,點擊更新按鈕,任務將被標記爲完整無缺。但是當我試圖取消選中後的任務時,沒有任何內容會被髮送到更新操作,直到我再次點擊更新按鈕,最終它們被標記爲不完整。check_box_tag顯示檢查不正確

形式

<%= form_tag '/day_tasks/update', :method => :put do %>          
    <% @day_tasks.each do |day_task| %>  
    <%= check_box_tag "day_tasks[]", day_task.id, day_task.is_complete? %>    
    <%= day_task.task.content %><br />                
    <% end %>                      
    <%= submit_tag "Update" %>                  
<% end %> 

更新動作

def update 
    params[:day_tasks] ||= [] 
    params[:day_tasks].each do |x| 
    DayTask.find(x).toggle(:is_complete).save 
    end 
    redirect_to day_tasks_path 
end 

我敢肯定的問題是與背後顯示框是否被選中(day_task.is_complete?)邏輯,因爲如果我刪除代碼片段,雖然方塊永遠不會被檢查,但任務在後端檢查和取消選中。只有當這段代碼被包含時,我遇到了第二次點擊更新後沒有發送任何內容的問題。任何想法,爲什麼這是發生?

回答

0

問題是未檢查的複選框將永遠不會發送到服務器。

有一個絕招:前權利與同一添加一個隱藏的輸入字段,並給它像假值:

<%= form_tag '/day_tasks/update', :method => :put do %>          
    <% @day_tasks.each do |day_task| %>  
    <%= hidden_field_tag "day_tasks[#{day_task.id}]", "0" %> 
    <%= check_box_tag "day_tasks[#{day_task.id}]", "1", day_task.is_complete? %>    
    <%= day_task.task.content %><br/>                
    <% end %>                      
    <%= submit_tag "Update" %>                  
<% end %> 

所以,現在如果不選中該複選框,值當複選框被選中時,複選框「覆蓋」隱藏字段並將值設置爲1(真)

您必須修改更新操作,因爲您將得到如下所示的散列:

day_tasks[task_id] = 0/1 (not completed/completed) 

你的更新動作:

def update 
    params[:day_tasks] ||= {} 
    params[:day_tasks].each do |task_id, completed| 
    DayTask.find(task_id).update_attribute(:is_complete, completed) 
    end 
    redirect_to day_tasks_path 
end 
+0

完美的作品!謝謝你的幫助! –