设计验证电子邮件属性,不包括文字和@myapp.com



尝试使用单词exclusion验证rails design应用程序中的电子邮件字段。

  validates :email, :exclusion => {:in => ["admin", "root",,
                                   :message => "is reserved"}

Wich在:username字段上工作得很好,但在电子邮件上则不然。

我怀疑Devise"接管"了电子邮件字段的验证,我需要超级/否决Devise的注册控制器。

我怎么能:

  • 阻止包含基于排除的单词的电子邮件
  • 禁止使用@myapp.com发送电子邮件,这样用户就不会使用该应用运行的域

您总是可以编写自定义验证来实现您想要的。指南示例:

添加用于验证个人的自定义验证器的最简单方法属性与方便的ActiveModel::EachValidator一起使用。在这个在这种情况下,自定义验证器类必须实现validate_each方法它有三个参数:记录、属性和值对应于实例、要验证的属性和传递实例中属性的值。

class EmailValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    unless value =~ /A([^@s]+)@((?:[-a-z0-9]+.)+[a-z]{2,})z/i
      record.errors[attribute] << (options[:message] || "is not an email")
    end
  end
end
class Person < ActiveRecord::Base
  validates :email, :presence => true, :email => true
end

在检查它是否是一封电子邮件后,我会将两个验证分开。一个用于排除,另一个用于域。您可以在使用passenger时检索当前域。

validate :email_username_is_not_on_blacklist, :email_domain_is_allowed
EXCLUDED_USERNAMES = "admin", "root"
EXCLUDED_DOMAINS = "myapp.com"
def email_username_is_not_on_blacklist
  user, domain = email.split("@")
  errors.add(:email, "E-mail user is not allowed") if self.class.EXCLUDED_USERNAMES.include?(user)
end
def email_domain_is_allowed
  user, domain = email.split("@")
  errors.add(:email, "E-mail domain is not allowed") if self.class.EXCLUDED_DOMAINS.include?(domain)
end

相关内容

最新更新