如何添加用户模型验证以阻止某些电子邮件域

时间:2012-03-14 18:51:56

标签: ruby-on-rails regex ruby-on-rails-3 activemodel

我希望有一个经过验证的电子邮件域列表,以防止在我的应用上注册。

10minutemail.com,yopmail.com,mail.com,mail.ru等......

我的用户模型中有一个域列表,如下所示:

BAD_DOMAINS = [/10minutemail.com/, /yopmail.com/, /mail/

我想在电子邮件字段中添加用户验证,以便在用户注册其中一个域时添加错误。

BAD_DOMAINS.each { |rule| return true if !domain.match(rule).nil? }

我有正则表达式工作,但如何将其作为验证添加?我试过这个:

validates :email, :format => { : exclusion => BAD_DOMAINS,
        :message => "%{value} no good." }

由于

1 个答案:

答案 0 :(得分:2)

您需要将所有单独的正则表达式组合成单个正则表达式,但如果您有一个字符串列表而不是正则表达式列表,您可能会发现它更容易实现:

EXCLUSION_DOMAINS = %w[
  example.com
  test.com
  asdf.com
]

EXCLUSION_REGEXP = Regexp.new('(?:' + EXCLUSION_DOMAINS.collect { |d| Regexp.escape(d) }.join('|') + ')$')

你需要确保事情与此不相符,所以使用它会有所不同:

validates :email,
  :format => {
    :with => VALID_EMAIL_REGEXP,
    :without => EXCLUSION_REGEXP,
    :message => "%{value} no good."
  }

您应该使用某种有效的电子邮件测试程序,以确保地址合理。它在这里表示为VALID_EMAIL_REGEXP,它是某种电子邮件验证器正则表达式。如果你这样做,请尝试并使用符合RFC的协议。