Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 自定义电子邮件验证程序不';行不通_Ruby On Rails_Ruby_Validation - Fatal编程技术网

Ruby on rails 自定义电子邮件验证程序不';行不通

Ruby on rails 自定义电子邮件验证程序不';行不通,ruby-on-rails,ruby,validation,Ruby On Rails,Ruby,Validation,我有一个基于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]

我有一个基于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

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

要使此目录对rails autoloader可见,您需要将其添加到
application.rb

# config/application.rb

# ...

# add custom validators path
config.autoload_paths += %W["#{config.root}/app/validators/"]

并重新启动rails服务器

要使rails autoloader可以看到此目录app/validators/,您需要将其添加到
application.rb

# config/application.rb

# ...

# add custom validators path
config.autoload_paths += %W["#{config.root}/app/validators/"]

然后重新启动rails服务器

此问题有几种解决方案。问题是您的
电子邮件验证程序
不在加载路径上,因此Rails不知道如何找到它。以下任何一种解决方案都应该有效:

  • 在要使用的文件中明确要求使用
    电子邮件验证程序
    ,或者甚至在初始值设定项中,如下所示:

    # config/initializers/validators.rb
    require "#{Rails.root}/app/validators/email_validator"
    
  • 验证程序
    目录添加到应用程序的自动加载路径:

    # config/application.rb
    config.autoload_paths += %W["#{config.root}/app/validators/"]
    
  • 将您的
    email\u validator
    放在一个目录中,该目录已经位于自动加载路径上,如
    app/models/email\u validator.rb
    lib/email\u validator.rb


  • 就我个人而言,#2是我的首选解决方案,因为它通过为验证器指定一个特定的目录,为你的应用程序提供了一个很好的结构,而且你以后在添加新的验证器时不需要更改任何代码。

    有几种解决方案。问题是您的
    电子邮件验证程序
    不在加载路径上,因此Rails不知道如何找到它。以下任何一种解决方案都应该有效:

  • 在要使用的文件中明确要求使用
    电子邮件验证程序
    ,或者甚至在初始值设定项中,如下所示:

    # config/initializers/validators.rb
    require "#{Rails.root}/app/validators/email_validator"
    
  • 验证程序
    目录添加到应用程序的自动加载路径:

    # config/application.rb
    config.autoload_paths += %W["#{config.root}/app/validators/"]
    
  • 将您的
    email\u validator
    放在一个目录中,该目录已经位于自动加载路径上,如
    app/models/email\u validator.rb
    lib/email\u validator.rb

  • 就我个人而言,#2是我的首选解决方案,因为它通过为验证器指定一个特定的目录为您的应用程序提供了一个很好的结构,并且您以后在添加新验证器时不需要更改任何代码。

    试试这个

    def validate_each(record, attribute, value)
        begin
          r =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
        rescue Exception => e
          r = false
        end
        record.errors[attribute] << (options[:message] || "is not an email") unless r
    end
    
    def验证每个(记录、属性、值)
    开始
    r=~/\A([^@\s]+)@((?:[-A-z0-9]+\)+[A-z]{2,})\z/i
    救援异常=>e
    r=假
    结束
    记录。错误[属性]1
    # user@localhost被排除在外
    #树顶必须响应域
    #我们排除有效的电子邮件值,如
    #因此,我们使用m.uu send_uu(tree).domain
    r&&=(t.domain.dot\u atom\u text.elements.size>1)
    救援异常=>e
    r=假
    结束
    record.errors[attribute]试试这个

    def validate_each(record, attribute, value)
        begin
          r =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
        rescue Exception => e
          r = false
        end
        record.errors[attribute] << (options[:message] || "is not an email") unless r
    end
    
    def验证每个(记录、属性、值)
    开始
    r=~/\A([^@\s]+)@((?:[-A-z0-9]+\)+[A-z]{2,})\z/i
    救援异常=>e
    r=假
    结束
    记录。错误[属性]1
    # user@localhost被排除在外
    #树顶必须响应域
    #我们排除有效的电子邮件值,如
    #因此,我们使用m.uu send_uu(tree).domain
    r&&=(t.domain.dot\u atom\u text.elements.size>1)
    救援异常=>e
    r=假
    结束
    
    record.errors[attribute]我注意到Hamed的解决方案#1对您部分有效,但您得到了“未定义的局部变量或方法”

    如果尝试将变量放在比较运算符的左侧,则会出现此错误

    除非正确的格式是

    unless /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i =~ value 
    

    我注意到Hamed的解决方案#1对您部分有效,但您得到了“未定义的局部变量或方法”

    如果尝试将变量放在比较运算符的左侧,则会出现此错误

    除非正确的格式是

    unless /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i =~ value 
    

    我刚刚遇到了这个问题,这是真正的解决办法

    事实证明,从Rails文档中复制和粘贴代码可能会导致混合空格字符,从而导致代码解析错误。给你。注意,所有的东西看起来都一样,但总有一点不同!如果运行第一个版本,将出现相同的错误:

    NameError: undefined local variable or method 'record' for WholeNumberValidator:Class
    
    如果我们检查字节,我们会看到差异:

    # Standard Space
    ' '.bytes # => [32]: U+0020, Space
    # Space from Copy/Paste
    ' '.bytes # => [194, 160]: U+00A0, No break space
    

    替换文件中的空格,一切都应该正常

    我刚刚遇到了这个问题,这是真正的解决办法

    事实证明,从Rails文档中复制和粘贴代码可能会导致混合空格字符,从而导致代码解析错误。给你。注意,所有的东西看起来都一样,但总有一点不同!如果运行第一个版本,将出现相同的错误:

    NameError: undefined local variable or method 'record' for WholeNumberValidator:Class
    
    如果我们检查字节,我们会看到差异:

    # Standard Space
    ' '.bytes # => [32]: U+0020, Space
    # Space from Copy/Paste
    ' '.bytes # => [194, 160]: U+00A0, No break space
    

    替换文件中的空格,一切都应该正常

    @pavan看看这个。。。可能是个愚蠢的问题,但是您已经停止并启动了开发服务器和/或rails控制台?这就是我第一次发现这个验证器的地方。这根本不是一个愚蠢的问题,我是一个初学者,所以我可能会犯奇怪/愚蠢的错误。不过,我在运行rspec时遇到了这个错误,因此首先没有服务器运行。谢谢manu。我是否需要向开发环境中添加一些东西,以便正确加载验证文件?这就是问题所在。任何地方都没有可添加的内容。我没必要。我只是搭了个脚手架,加上了验证器。工作顺利:P@pavan看这个。。。可能是个愚蠢的问题,但是您已经停止并启动了开发服务器和/或rails控制台?这就是我第一次发现这个验证器的地方。这根本不是一个愚蠢的问题,我是一个初学者,所以我可能会犯奇怪/愚蠢的错误。不过,我在运行rspec时遇到了这个错误,因此首先没有服务器运行。谢谢manu。我是否需要向开发环境中添加一些东西,以便正确加载验证文件?这就是问题所在。任何地方都没有可添加的内容。我没必要。刚搭好我的脚手架