【发布时间】:2020-05-15 02:59:01
【问题描述】:
我有一封电子邮件ActiveRecord(子类,不同的 PG DB)具有以下验证:
class Email < DbRecord
belongs_to :user
attr_accessor :skip_validation
alias_method :skip_validation?, :skip_validation
validates :value,
presence: true,
uniqueness: true,
format: {
with: URI::MailTo::EMAIL_REGEXP,
message: "is an invalid email address",
allow_blank: true,
},
unless: :skip_validation?
before_validation { |record| record.value = record.value&.downcase }
skip_validation 为零。没有其他实例方法。
当没有user_id 时,验证按预期工作。
> e = Email.new(value: "foo@bar")
=> #<Email id: nil, user_id: nil, value: "foo@bar">
> e.valid?
=> false
当有 user_id 时,虚假电子邮件不会触发验证。
> e = Email.new(user_id: 7, value: "foo@bar")
=> #<Email id: nil, user_id: 7, value: "foo@bar">
> e.valid?
=> true
请注意,在 belongs_to 上设置 validate: true 没有帮助:
class Email < DbRecord
belongs_to :user, validate: true
仍然存在:
> e = Email.new(user_id: 7, value: "foo@bar")
=> #<Email id: nil, user_id: 7, value: "foo@bar">
> e.valid?
=> true
这是为什么呢?我还应该看什么/寻找什么?
【问题讨论】:
标签: ruby ruby-on-rails-5