Rails3无法加载我在lib中的验证器

10

我把EmailValidator放在lib/validators/email_validator里,但它不起作用(我将root/lib放在load_path中)

以下是代码.. 我把这个类放在一个名为validators的模块中,这是父文件夹的名称

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'


请展示一下您如何将 root/lib 加入到加载路径中。 - Ryan Bigg
config.autoload_paths +=%W(#{config.root}/lib) - gilsilas
3个回答

14
你有两个选择:
  1. 将你的自定义验证器放在 config/initializers 下。
  2. 或者在 config/application.rb 中添加 lib/validators 到自动加载路径中。

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

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

由于OP的类位于“Validators::”命名空间下,并且“lib”目录默认在自动加载路径上,我怀疑这不是问题所在。 - d11wtq
1
Rails 3不再延迟加载lib目录中的文件,您必须将lib目录添加到autoload中,或显式地要求适当的文件。 - Douglas F Shearer
你说的关于lazy_loads是正确的,但我已经添加了/lib的通用路径,而email_validator在validators模块下(就像文件夹包含email_validator一样),所以不需要在配置文件中再添加另一个路径,它应该可以正常工作吧? - gilsilas
啊,抱歉,我错过了那个细节。我需要查看自动加载的代码,但我认为它是非递归的,因此它不会获取目录中的文件。 - Douglas F Shearer
它将会在提供的目录中挑选文件,只要你遵循命名规范(即文件夹名称=下划线模块/类名称)...没有必要将每个命名空间都添加到自动加载路径中 ;) - d11wtq

10

由于您将自定义验证器放在lib/validators中的Validators::中,因此您还必须使用该命名空间来引用它。

validates :email, presence: true, :'validators/email' => true

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将无法看到它。

我将其与用户模型一起使用。以下是代码---> class User < ActiveRecord::Base validates :name, :presence => true; validates :email, :presence => true, :email => true, :uniqueness => true; .谢谢 - gilsilas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接