我把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
我收到错误未知验证器:"电子邮件"
您有两个选择:
- 将您的自定义验证器置于
config/initializers
下。 -
或者将
lib/validators
添加到config/application.rb
中的自动加载路径中。config.autoload_paths << "#{config.root}/lib/validators"
就个人而言,我会选择第二种选择,因为lib/validators
可以很好地封装。
由于您将自定义验证器放在lib/validators
的Validators::
中,因此您还必须使用该命名空间引用它。
validates :email, presence: true, :'validators/email' => true
更新:你需要这个:
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 不会看到它。