第二次点击后,我无法再次将布尔值更新为false。
def completed
if @todo.update_attribute(:completed, true)
flash[:success] = "Wowzers."
redirect_to dashboard_path
else
flash.now[:error] = "Not so wowzers..."
render :new
end
end
这就是我目前所拥有的,它一旦点击就将我的布尔值设置为true但我不确定如何if @todo.update_attribute(:completed, true, false)
认为这就像一个切换,true然后是假但是事实并非如此。
我也试过
if params[:completed] == 0
@todo.update_attribute(:completed, true)
flash[:success] = "Wowzers."
redirect_to dashboard_path
elsif params[:completed] == 1
@todo.update_attribute(:completed, false)
flash[:success] = "Wowzers."
redirect_to dashboard_path
end
但这不会保存到我的数据库(true或false)。
我的问题是;如何将我的复选框切换为true然后为false,而不仅仅是true或false?
答案 0 :(得分:2)
逻辑否定的基本原则是!
,not
运算符,是你的朋友:
@todo.update_attribute(:completed, !@todo.completed)
那将来回翻转。
答案 1 :(得分:2)
在HTML post请求中,params总是作为字符串传递,因此params[:completed] == 1
将始终为false。您可能需要params[:completed] == '1'
或params[:completed] == 'true'
。
此外,如果您想切换参数,只需使用切换操作。
@todo.toggle(:completed)
否则,要根据您的参数使用不等式进行保存
if @todo.update_attribute(:completed, params[:completed] != '1')
flash[:success] = "Wowzers."
elsif
flash[:error] = "Couldn't update completed status"
end
redirect_to dashboard_path
答案 2 :(得分:0)
def completed
if @todo.update_attribute(:completed, params[:completed])
flash[:success] = "Wowzers."
redirect_to dashboard_path
else
flash.now[:error] = "Not so wowzers..."
render :new
end
end