自定义EmailValidator不起作用

vii*_*sko 0 ruby validation ruby-on-rails

我有一个基于ruby指南的自定义电子邮件验证程序类:

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
Run Code Online (Sandbox Code Playgroud)

 

此类位于app/validators/email_validator.rb中

模型:

class User < ActiveRecord::Base

    validates :name, :email, presence: true
validates :email, email: true

end
Run Code Online (Sandbox Code Playgroud)

错误:

`rescue in block in validates': Unknown validator: 'EmailValidator' (ArgumentError)
Run Code Online (Sandbox Code Playgroud)

运行测试(rspec)时会出现此错误.

fny*_*fny 9

我刚遇到这个问题,这是真正的解决方案.

事实证明,从Rails文档复制和粘贴代码可能会留下混合空格字符,这会导致代码错误地解析.这是我的验证器的原始和更正版本的示例gist差异.注意一切看起来都一样,但不知何故有一个差异!如果您运行第一个版本,您将得到相同的错误:

NameError: undefined local variable or method 'record' for WholeNumberValidator:Class
Run Code Online (Sandbox Code Playgroud)

如果我们检查字节,我们会看到差异:

# Standard Space
' '.bytes # => [32]: U+0020, Space
# Space from Copy/Paste
' '.bytes # => [194, 160]: U+00A0, No break space
Run Code Online (Sandbox Code Playgroud)

替换文件中的空格,一切都应该有效!

  • 谢谢,这令人沮丧.多么奇怪的错误. (2认同)
  • 非常感谢,这绝对应该是公认的答案!我想知道在Rails指南网站上修复字符编码的解决方案是什么,以避免将来出现这个问题. (2认同)