You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ActiveInteraction自定义验证不生效,求助原因及解决方案

问题原因及解决方法

你的问题出在对Active Interaction自定义验证的逻辑理解有误:Active Interaction的自定义验证方法不是通过返回false来触发验证失败的,必须主动调用errors.add添加错误条目,才会将对象标记为无效状态。

你当前的validate_u方法仅返回false,但没有向错误集合中添加任何内容,所以系统会认为验证通过,进而正常执行execute方法,这就导致:

  • res.result得到execute的返回值1
  • res.valid?返回true
  • res.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 21:15:47