Rails如何让"已删除"的model对象不能被编辑(三)

2017-02-16 11:03

上面两篇比较好的解决了所需的问题.

但是现在又有新需求了:在删除对象时必须给出删除原因.即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