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

在第一篇中我们讨论了如何控制model的hook流.

但是其实其中还是有未考虑到的地方,比如在新建一个model对象的时候,会报错:

ActiveRecord::ActiveRecordError: can not update on a new record object

意思是你不能在一个新建对象上调用update方法!

对应的代码如下:

def was_deleted=(new_val)
    unless self.was_deleted
        update_column(:was_deleted,new_val)
    end
end

无疑在update和new时都会调用该方法,所以我们必须搞清楚到底是什么原因然后才能做出处理.恰好rails提供一个changed?方法,官方的解释为:

Returns true if any of the attributes have unsaved changes, false otherwise.

注意是unsaved changes!!!如果是新建那么changed?自然返回true,所以我们重构如下:

def was_deleted=(new_val)
    unless self.was_deleted
        if !changed?
            update_column(:was_deleted,new_val)
        else
            #do something ...
        end
    end
end

问题是在else中做点什么,如果啥都不做was_deleted属性不会更新的哦!

第一次尝试如下:

alias :"was_deleted=" :"org_was_deleted="

def was_deleted=(new_val)
    unless self.was_deleted
        if !changed?
            update_column(:was_deleted,new_val)
        else
            org_was_deleted=(new_val)
        end
    end
end

看上去不错,但实际运行会报错,提示找不到org_was_deleted=方法,因为org_was_deleted=是was_deleted=的别名,所以实际就是找不到was_deleted=方法!?你可能会奇怪,如果没有这个方法为什么会调用自定义的方法呢???

其实很简单,该model类中的确没有对应的was_deleted=方法,该方法是ActiveRecord::Base类(或其超类)自动生成的,所以我们不用操心自己创建别名了,只要简单的调用super即可,最终的代码如下:

def was_deleted=(new_val)
    unless self.was_deleted
        if !changed?
            update_column(:was_deleted,new_val)
        else
            super
        end
    end
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大熊猫侯佩

赏点钱让我买杯可乐好吗 ;)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值