添加自定义规则至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
相关产品推荐
相关产品推荐

