验证电子邮件包含其他字段轨道

时间:2017-01-18 01:12:17

标签: ruby-on-rails validation model format

我需要验证用户的电子邮件是否包含其关联的值:

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

1 个答案:

答案 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),但这取决于您。