【问题标题】:Custom validation rails自定义验证轨道
【发布时间】:2013-12-23 07:01:24
【问题描述】:

我在模块中有EmailValidator 类,例如:

module ActiveModel
  module Validations
    class EmailValidator < EachValidator
      def validate_each(record, attribute, value)
        if value.presence && (value =~ /\A[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+\z/).nil?
          record.errors[attribute] << (options[:message] || "is invalid")
        end
      rescue => e
        record.errors[attribute] << (options[:message] || "is invalid")
      end
    end
  end
end

我试图在我的模型中使用它,但是当我尝试启动 rails 服务器时遇到加载错误 => email_validator.rb 来定义 EmailValidator (LoadError)

谁能帮我解决这个问题?

【问题讨论】:

  • 这个模块是否在一个名为email_validator.rb的文件中?
  • 是的。该文件位于 lib/active_model/validations/email_validator.rb
  • 在 application.rb 上有这个 config.autoload_paths += %W(#{config.root}/lib) 吗?
  • 我在 application.rb 中有这个配置设置
  • 为什么要把它放在一个模块中?我已经把它放在了一个 app/validators 文件夹中,但只是简单地定义了这个类,它周围没有任何模块

标签: ruby-on-rails ruby validation ruby-on-rails-3.2


【解决方案1】:

我建议改用the valid_email gem,因为验证电子邮件地址真的很痛苦!

class User < ActiveRecord::Base
  validates :email, :presence => true, :email => true

  # ...
end

另请参阅this humongous regular expression,它实际上根据 RFC 822 验证电子邮件地址。

【讨论】:

  • 我正在使用活动资源。有什么方法可以在不使用 gem 的情况下进行电子邮件验证并保持代码干燥。
【解决方案2】:

validates_format_of :email, :with =>~ /\A[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z ]+\z/

【讨论】:

    【解决方案3】:

    您可以尝试这种语法并根据此 blog 实现您的代码,这应该很有帮助:-

    class EmailValidator < ActiveModel::EachValidator
      def validate_each(record, attribute, value)
        if value.presence && (value =~ /\A[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+\z/).nil?
          record.errors[attribute] << (options[:message] || "is invalid")
        end
      rescue => e
        record.errors[attribute] << (options[:message] || "is invalid")
      end
    end
    

    只需将此文件放在 app/validators/email_validator.rb 中

    如需 Rails 3 自定义验证,请read此博客。

    在 Rails 4 中

    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
    
    class foo < ActiveRecord::Base
      validates :email, presence: true, email: true
    end
    

    最后非常简单和干燥的使用 reg。 exp.:-

    /\A[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+\z/
    

    改编自http://www.regular-expressions.info/email.html

    【讨论】:

      猜你喜欢
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多