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

添加自定义规则至Reform表单时遇undefined method 'rule'错误

Reform表单Dry验证报错:undefined method `rule'的解决方法

问题根因

你的错误本质是Reform仍在使用ActiveModel验证系统,而非Dry验证。即便全局启用了Reform::Form::Dry,但表单中使用了ActiveModel风格的validates选项,触发了默认的ActiveModel验证逻辑,导致validation块被ActiveModel的验证组处理——而它没有rule方法。

解决步骤

1. 确保Dry验证全局启用且加载时机正确

检查你的初始化器(如config/initializers/reform.rb):

require "reform/form/dry"
Reform::Form.class_eval do
  feature Reform::Form::Dry
end

将初始化器命名为01_reform.rb这类前缀带数字的文件名,确保Rails启动时优先加载它,再加载表单类。

2. 移除ActiveModel风格的validates选项

删除表单中property后面的validates参数,改用Dry验证的原生语法定义规则。

3. 修正表单代码(纯Dry验证语法)

以下两种写法任选其一:

写法一:使用Dry Validation内置规则

class StudentForm < Reform::Form
  property :first_name
  property :last_name
  property :email

  validation do
    # 必填字段验证
    required(:first_name).filled
    required(:last_name).filled
    # 邮箱格式验证
    required(:email).filled(format?: /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i)
  end
end

写法二:自定义rule规则

如果需要更复杂的自定义逻辑,用rule实现:

class StudentForm < Reform::Form
  property :first_name
  property :last_name
  property :email

  validation do
    # 基础必填验证
    required(:first_name).filled
    required(:last_name).filled
  end

  # 单独的邮箱格式验证组
  validation name: :email_format do
    rule(:email) do
      unless /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i.match?(value)
        key.failure('has invalid format')
      end
    end
  end
end

4. 确认依赖Gem已安装

确保Gemfile包含dry-validation(Reform的Dry验证功能依赖它):

gem 'reform'
gem 'dry-validation'

执行bundle install更新依赖。

验证

现在执行StudentForm.new不会再报错,调用form.validate(params)时会正确触发Dry验证逻辑。

内容的提问来源于stack exchange,提问作者Harsh Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 00:39:57