新手问题 before_save 时修改 record 的 boolean 类型属性,导致 save! 失败

thanatos · 2015年07月22日 · 最后由 davidwei 回复于 2015年07月22日 · 1632 次阅读

在保存一个 record 的时候,我做了一个 before_save,对 record 进行判断并修改它的一个属性值。坑爹的是这个属性值是 boolean,如果方法返回 true 还好,record 可以保存,但是如果返回 false,属性值是赋上了 false,方法也返回 false,同时这个 false 会影响 before_save,导致 save!失败。 没办法,我只能在 before_save 调用的方法中最后返回一句话,以保证永远都是 true,但是这样做感觉挺 sb 的,不知道正确的做法是啥样的?感谢?

class Host < ActiveRecord::Base
  before_save :idle?
  validates :HostName, presence: true

  def idle?
    if ( self.Adapter1IP.empty? && self.Adapter2IP.empty? && self.Adapter3IP.empty? && self.Adapter4IP.empty? && self.Adapter5IP.empty? )
      self.Idle = true
    else
      self.Idle = false
    end
    "shit!"
  end
end

这个坑从 Rails 诞生之日就一直存在,没有什么特别好的方法预防,只能通过测试来确保 callback 的行为符合预期。 等 Rails 5 发布后,callback 返回 false 就不会 halt 整个的 callback chain 了,必须显试调用 throw :abort 才行。 https://github.com/rails/rails/pull/17227

#1 楼 @lgn21st 好吧,非常感谢解答,坐等 5.0

before callback 都会有这样的问题,被坑过。。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号