2011-10-06 83 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

完美的作品!谢谢你的帮助! –