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

来源:互联网 发布:万网域名解析 端口号 编辑:程序博客网 时间:2024/06/16 07:28

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

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

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

before_update do |r|    #do somethingend

首先想到的写法是:

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

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

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

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

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

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

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

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

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

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

但你也不能这么写:

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

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

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

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

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

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

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

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

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

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 儿童新长出的大门牙像两边撇怎么办 被烫伤了怎么办的活动反思怎么写 生完孩子脸上起蝴蝶斑了怎么办 鼻子部位突然长了晒斑怎么办 我脸上长有日晒斑.该怎么办 做为小领导同事不听你的怎么办 二年级的小孩叫写作业不听怎么办 苹果手机微信出现黑框怎么办 百度网盘下载原画视频会闪退怎么办 已发布的公众号推文段落重复怎么办 谷歌商店找不到方舟手游怎么办 染头发的颜色弄到衣服上怎么办 橡皮把桌面油漆弄掉了怎么办 手机被调成静音不知道放哪了怎么办 金丝熊吃大米吃撑了怎么办 部落有可疑记录被暂时禁封怎么办 鼻子通向嘴那里痒得难受怎么办 小孩上嘴唇中间的连线碰掉了怎么办 秋田犬夏天退毛严重么 怎么办 初中数学基本没学过高中怎么办 老师家纺突然想日语文老师怎么办 微信聊天表情小企鹅不动了怎么办 微信自带小表情不全怎么办 爱奇艺电视果有图像无声音怎么办 微信表情包保存不到手机相册怎么办 才出生的兔宝宝被母兔抓伤了怎么办 老婆生气了说恨我一辈子我该怎么办 华为手机微信表情不显示含义怎么办 地下城游戏登录链接一直失败怎么办 聊天时别人打听家人不想回答怎么办 微信钱包零钱密码忘了怎么办 斗图我能怎么办我也很无奈 微信解冻设备不一致申诉失败怎么办 看不懂微信脸部表情什么意思怎么办 有的动图图片过大微信发不了怎么办 微信漂流瓶扔瓶子没有人回复怎么办 删了微信 手贱 添加 怎么办 姨妈弄到床垫上拆不下来洗怎么办 碰到情商智商都高的小人怎么办 微信聊天界面右上角的小人头怎么办 最近摸高摸到的高度越来越矮怎么办