ActiveInteraction自定义验证不生效,求助原因及解决方案
问题原因及解决方法
你的问题出在对Active Interaction自定义验证的逻辑理解有误:Active Interaction的自定义验证方法不是通过返回false来触发验证失败的,必须主动调用errors.add添加错误条目,才会将对象标记为无效状态。
你当前的validate_u方法仅返回false,但没有向错误集合中添加任何内容,所以系统会认为验证通过,进而正常执行execute方法,这就导致:
res.result得到execute的返回值1res.valid?返回trueres.errors.messages为空哈希
修正后的代码
要实现你预期的验证失败效果,需要修改验证方法,主动添加错误信息:
require 'active_interaction' class Sleep < ActiveInteraction::Base validate :validate_u def execute puts 1 1 end private def validate_u # 添加错误信息,标记验证失败 errors.add(:base, "自定义验证未通过") end end res = Sleep.run res.result # => nil(execute不会执行) res.valid? # => false res.errors.messages # => {:base=>["自定义验证未通过"]}
补充说明
Active Interaction的验证逻辑中,自定义验证方法的返回值不影响验证结果,只要方法没有抛出异常且未添加错误,就会判定验证通过。只有当你通过errors.add向错误集合中添加内容时,才会触发验证失败,此时execute方法不会被调用,result为nil,valid?返回false,错误信息也会被正确记录。
内容的提问来源于stack exchange,提问作者Mr.Zeliboba
相关产品推荐
相关产品推荐

