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

这里的已删除被打了引号,意思是并未真的从数据库中删除,而是其有一个was_deleted属性,如果值为true则表示其已被删除.这时用户还能查看其内容,但无疑不能再编辑它了.

那么用rails的model验证和hook如何实现这样的效果呢?

首先编辑执行的是update方法,所以我们必须在before_update上下功夫:

before_update do |r|
    #do something
end

首先想到的写法是:

before_update do |r|
    if r.was_deleted
        r.errors[:base] << "不可以编辑已删除的风险项!"
        false
    end
end

但是这样的话将不可以把was_deleted属性设置为true!但这恰恰正是触发条件啊!

所以我们必须排除was_deleted属性被更新的情况:

before_update do |r|
    unless r.was_deleted_changed?
        if r.was_deleted
            r.errors[:base] << "不可以编辑已删除的风险项!"
            false
        end
    end
end

貌似不错,但还有一个问题,因为你此时没有限制用户修改was_deleted属性,所以如果用户将一个已删除的model又改为未删除怎么办?即在was_deleted已经为true时将其设为false.

这取决于你怎么理解”已删除”这个功能.如果你认为可以将”已删除”的对象变为”未删除”,然后再操作之的话,那么这是可以接受的.

但这里我们不希望这样,当一个对象变为”已删除”后,就不可以做任何修改了!

所以我们还得写一个赋值钩子,以下是我的第一次尝试:

def was_deleted=(new_val)
    unless self.was_deleted
        self.was_deleted = new_val
    end
end

好吧,上面是一个死循环…

但你也不能这么写:

def was_deleted=(new_val)
    unless self.was_deleted
        @was_deleted = new_val
    end
end

因为was_deleted后面没有一个真正的实例变量作为后备啊!

让我再想想…这样如何呢:

def was_deleted=(new_val)
    unless self.was_deleted
        update_attributes(was_deleted:new_val)
    end
end

神马!还是死循环!看来update_attribute内部还是调用了赋值方法啊!

所以我们必须直接跳过赋值,直入数据库层了:

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

update_column跳过了验证,但是没关系.因为向数据库写入一个bool值无所谓成功或失败.

这样一番折腾后,我们达到了开头需要的效果 ;)

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大熊猫侯佩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值