我试图向我的用户模型实例添加一个自定义错误,但是当我调用valid时?它正在清除自定义错误并返回true.

[99] pry(main)> u.email = "test@test.com"
"test@test.com"

[100] pry(main)> u.status = 1
1

[101] pry(main)> u.valid?
true

[102] pry(main)> u.errors.add(:status, "must be YES or NO")
[
    [0] "must be YES or NO"
]

[103] pry(main)> u.errors
#<ActiveModel::Errors:[...]@messages={:status=>["must be YES or NO"]}>

[104] pry(main)> u.valid?
true

[105] pry(main)> u.errors
#<ActiveModel::Errors:[...]@messages={}>

如果我从模型中使用validate方法,那么它是有效的,但是这个特定的验证是从另一个方法中添加的(需要通过参数):

User

def do_something_with(arg1, arg2)
  errors.add(:field, "etc") if arg1 != arg2
end

由于上述原因,用户.有效的即使将该错误添加到实例中,也会返回true.

推荐答案

在ActiveModel中,valid?的定义如下:

def valid?(context = nil)
  current_context, self.validation_context = validation_context, context
  errors.clear
  run_validations!
ensure
  self.validation_context = current_context
end

因此,预期会清除现有错误.您必须将所有自定义验证放入大约validate个回调中.这样地:

validate :check_status

def check_status
  errors.add(:status, "must be YES or NO") unless ['YES', 'NO'].include?(status)
end

Ruby-on-rails相关问答推荐

Gemfile需要较新版本的依赖项

引用连接 Rails 表中枚举的查询

Ruby on Rails 身份验证:设计注册不起作用

如何断言 Ruby 单元测试中的错误消息?

Rails 7 共享刺激控制器功能

只允许用户在 Rails 中输入字母和数字

使用brew 软件安装了 elasticsearch,但找不到配置文件

验证以确保唯一性但忽略空值?

在 Rails 的 ActiveRecord 中,touch 有什么用?

如何将自定义过滤器添加到 Active Admin?

Ruby 元素是否存在于数组中

在 Rails/ActiveRecord 列名中使用问号字符

Rails 5:无法从参数中检索哈希值

ruby/ruby on rails 内存泄漏检测

如何一次显示一条 Ruby on Rails 表单验证错误消息?

在 Rails 中,在特定时区创建特定时间(不是现在)的最佳方式是什么?

我的 JavaScript 模式/实践很糟糕.我应该go 哪里寻求帮助?

Ruby 1.87 与 1.92 Date.parse

如何在 Rails 3 中订购包含的元素

何时在 Ruby on Rails 中使用 lambda?