【问题标题】:Cannot get very simple boolean check to update correctly, why?无法获得非常简单的布尔检查来正确更新,为什么?
【发布时间】:2015-08-25 12:32:59
【问题描述】:

有一个非常简单的控制器动作来改变一个叫做“草稿”的布尔值的状态

@interview.draft = true if @interview.draft == false

@interview.draft = false if @interview.draft == true

@interview.save!

这仍然失败,在模型中我没有更改布尔值的操作,它不会正确保存状态。知道为什么会这样吗?

我正在使用 postgres 和 rails 4,我在迁移中将其设置为默认值,并防止草稿列出现空值。

【问题讨论】:

  • 这将始终返回 false,因为它在到达第二行时始终为 true。它应该做什么?如果您只想翻转值,可以使用@interview.draft = !@interview.draft
  • 您的@interview 实例是否有任何错误?或任何其他错误?
  • @EgonWilzer 我很确定你已经回答了。为什么要在评论中回答?现在 OP 将没有“答案”可以接受,而且你不会得到那么多分。
  • 如果您想在保存之前先分配 draft 值,您也可以使用 toggle(不带 bang(!)),因为 toggle!(带 bang)会自动更新/保存 @ 987654329@立即记录在数据库中。

标签: ruby-on-rails activerecord boolean record


【解决方案1】:

@interview.draft 的操作将始终返回 false,因为它在到达第二行时始终为 true。

如果你只是想翻转你可以使用的值

@interview.draft = !@interview.draft

@interview.draft.toggle!

正如 xlembouras 所说。

【讨论】:

    【解决方案2】:

    更改以下两行:

    @interview.draft = true if @interview.draft == false
    
    @interview.draft = false if @interview.draft == true
    

    您可以通过多种方式做到这一点:

    @interview.draft = @interview.draft ? false : true
    
    @interview.draft = !@interview.draft
    
    @interview.draft.toggle!
    

    【讨论】:

      【解决方案3】:

      答案很简单,它的行为类似于 NOT 运算符。

      @interview.draft = !@interview.draft
      @interview.save
      

      这将产生您的预期结果。 ;) 希望这对你有用。

      【讨论】:

        【解决方案4】:

        简单的方法

        @interview.draft = !@interview.draft
        

        @interview.draft = @interview.draft.! 
        
        @interview.save
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-09-22
          • 2011-12-27
          • 1970-01-01
          • 1970-01-01
          • 2018-11-24
          • 2020-08-07
          • 2020-09-01
          • 2011-08-19
          相关资源
          最近更新 更多