【问题标题】:How to add a User model validation to block certain email domains如何添加用户模型验证以阻止某些电子邮件域
【发布时间】:2012-03-14 18:51:55
【问题描述】:

我想要一份经过验证的电子邮件域列表,以防止在我的应用上注册。

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." }

谢谢

【问题讨论】:

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


    【解决方案1】:

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

    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 标准的。

    【讨论】:

    • 谢谢...没有办法验证电子邮件是否有效?验证 :email, :presence => true, :email => true
    • 看来你必须把这个验证器分成两部分,只要你不能同时使用 :with 和 :without。
    猜你喜欢
    • 1970-01-01
    • 2013-12-17
    • 2014-12-10
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 2016-05-12
    相关资源
    最近更新 更多