复选框为true后,如果再次单击,如何将其设为false? (导轨4)

时间:2016-05-02 00:27:01

标签: ruby-on-rails ruby

第二次点击后,我无法再次将布尔值更新为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?

3 个答案:

答案 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