我需要验证用户的电子邮件是否包含其关联的值:
class Company << ApplicationRecord
validates :name, presence: true
has_many :users
end
class User << ApplicationRecord
belongs_to :company
validate :email, presence: true
end
我需要在保存用户之前,其电子邮件内容是公司的名称,例如。
如果公司名称为:fedex
,则用户的电子邮件必须为:example@fedex.com
我正在使用Rails 5.0
更新
正如 mrlew 所说,我把验证器写成方法,但除此之外我在app/validator
写了如下:
#User model
class User << ApplicationRecord
belongs_to :company
validate :email, presence: true
validates_with UserEmailValidator
end
#Validator
# app/validator/user_email_validator.rb
class UserEmailValidator < ActiveModel::Validator
def validate(record)
unless record.email =~ /\A[\w+\-.]+@#{record.company.name}\z/i
record.errors[:email] << "invalid email"
end
end
end
答案 0 :(得分:0)
您可以创建custom validator method。像这样:
class User << ApplicationRecord
belongs_to :company
validate :email, presence: true
validate :valid_company_email
private
def valid_company_email
unless self.email.match(/\S+@#{self.company.name}\.com/)
errors.add(:email, :invalid) #or replace :invalid with a custom message
end
end
end
一些注意事项:
.com
,如您所述。@
之前:接受除空白之外的所有内容。构建电子邮件正则表达式很困难(选中this answer),但这取决于您。