具有不存在的域名的电子邮件无法进行正则表达式验证

时间:2016-05-04 14:35:39

标签: ruby-on-rails regex

我的用户模型有以下验证:

VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email,
    presence: true,
    format: { with: VALID_EMAIL_REGEX }

除1封电子邮件外,它适用于电子邮件。我需要这封电子邮件才有效。失败的测试如下:

  it 'should accept a domain with more than 4 letters', focus: true do
    user.email = 'ecample@yahoo.today'
    expect(user.valid?).to be(true)
  end

此测试应该通过。有什么想法吗?(我完全可以通过电子邮件验证完全更改正则表达式)

这些是电子邮件字段上User模型的所有验证器:

#<EmailValidator:0x000000075b04d0
  @attributes=[:email],
  @options={:if=>#<Proc:0x000000075c5a10@/usr/local/rvm/gems/ruby-2.2.3@2parale/gems/devise_token_auth-0.1.37/app/models/devise_token_auth/concerns/user.rb:30>}>,
 #<ActiveRecord::Validations::PresenceValidator:0x00000007414338 @attributes=[:email], @options={}>,
 #<ActiveModel::Validations::FormatValidator:0x0000000740ef28 @attributes=[:email], @options={:with=>/\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i}>,
 #<ActiveModel::Validations::LengthValidator:0x0000000740de98 @attributes=[:email], @options={:minimum=>6, :maximum=>100}>,
 #<ActiveRecord::Validations::UniquenessValidator:0x0000000740ccf0

2 个答案:

答案 0 :(得分:1)

这似乎是devise_auth_token gem覆盖默认的Devise电子邮件验证(https://github.com/lynndylanhurley/devise_token_auth/issues/314)导致某些人出现问题的问题。不幸的是,似乎没有一种很好的方法可以告诉gem您想要使用哪种更新的格式/验证器。这给你留下了三个非理想的选择:

  1. 找到另一种不那么突兀的宝石
  2. 猴子修补有问题的课程(EmailValidator)
  3. 根据您需要的更新/更改分享宝石并提交PR
  4. 对不起,似乎不是一个很好/简单的解决方法:(

    干杯。

答案 1 :(得分:0)

为什么不使用python-email-validator

安装

pip install email_validator

示例用法

from email_validator import validate_email, EmailNotValidError

email = "my+address@mydomain.tld"

try:
    v = validate_email(email) # validate and get info
    email = v["email"] # replace with normalized form
except EmailNotValidError as e:
    # email is not valid, exception message is human-readable
    print(str(e))