上面两篇比较好的解决了所需的问题.
但是现在又有新需求了:在删除对象时必须给出删除原因.即was_deleted若为true,要求delete_reason必须不为”“.
我们先来做第一次尝试:
before_save do |r| if r.was_deleted && r.delete_reason == "" r.errors[:bese] << "删除时必须输入删除原因!" false end end
现在测试一下:
r=Risk.new(risk_type_id:1,risk_system_id:1,source:"s",result:"r",causation:"c",control:"ctrl",created_by_staff_id:1,delete_reason:"",was_deleted:false) r.was_deleted = true r.save
你会发现的确触发了错误,但是r的was_deleted也被改成true了,为毛会这样???
原因很简单你在was_deleted=里用了update_column(:was_deleted,new_val)方法,它不会管你有没有验证,始终会直接写数据库.
所以我们要做一些微调:
def was_deleted=(new_val) unless self.was_deleted if !changed? if new_val && self.delete_reason != "" update_column(:was_deleted,new_val) else super end else super end end end