rails3不会在lib中加载我的验证器

时间:2011-05-19 11:56:42

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

我将EmailValidator放在lib / validators / email_validator中并且它不起作用(我将root / lib放在load_path中)

这里是代码..我把模块验证器中的类作为父文件夹名称

class Validators::EmailValidator < ActiveModel::EachValidator
    def validate_each(object, attribute, value)
        unless value =~ /^([^@\s]+)@([a-z0-9]+\.)+[a-z]{2,}$/i
            object.errors[attribute] << (options[:message] || "is not formatted properly")
        end
    end
end

我收到错误未知验证器:'email'

3 个答案:

答案 0 :(得分:14)

您有两种选择:

  1. 将自定义验证器放在config/initializers
  2. 或者将lib/validators添加到config/application.rb中的自动加载路径。

    config.autoload_paths << "#{config.root}/lib/validators"

  3. 我个人会选择第二个选项,因为lib/validators可以很好地封装。

答案 1 :(得分:10)

由于您将自定义验证程序放在Validators::的{​​{1}}中,因此您必须使用该命名空间引用它。

lib/validators

答案 2 :(得分:4)

更新:你需要这个:

module Validators
  class EmailValidator < ActiveModel::EachValidator
    def validate(object, attribute, value)
        unless value =~ /^([^@\s]+)@([a-z0-9]+\.)+[a-z]{2,}$/i
            object.errors[attribute] << (options[:message] || "is not formatted properly")
        end
    end
  end
end

class YourModel < ActiveRecord::Base
  include Validators

  validates :email, :presence => true, :email => true
end

否则,您需要将验证程序类放在ActiveModel::Validations命名空间下。当您为类命名时,ActiveRecord不会看到它,如果该命名空间不是它已经包含的命名空间。