Rails:validates_with,我应该在什么地方放置Validator?

时间:2010-07-14 10:24:06

标签: validation ruby-on-rails-3

我有一个验证器EmailValidator和类User:

class EmailValidator < ActiveModel::Validator
  def validate(record)
    record.errors[:base] << "error"  unless record.email.scan("@")
end

class User < ActiveRecord::Base
  validates_with EmailValidator
end

如果我将EmailValidator定义放在lib /目录中的单独文件中,或者在User类定义后的user.rb中,我收到错误:

/usr/lib/ruby/gems/svn/gems/rspec-core-2.0.0.beta.16/lib/rspec/core/backward_compatibility.rb:20:in `const_missing': uninitialized constant User::EmailValidator (NameError)

但是,如果我在user.rb中的User定义之前放置EmailValidator定义,就像上面的示例一样,那就没问题。

我应该在什么地方放置EmailValidator?

2 个答案:

答案 0 :(得分:4)

您应该能够将lib/email_validator.rb放入最新的Rails 3 HEAD中,然后自动加载。

您使用的是旧版本吗?

在短暂的时间内(即直到提交被还原),lib中的文件没有被自动加载 - 我相信这仍然是目标,但是实施是错误的,所以现在还原了。为了安全且完全向前兼容,请将以下行添加到config/application.rb

config.autoload_paths      += %W( #{config.root}/lib )

或者,如果代码在使用您的应用程序时有效,但在运行RSpec时则无效,那么这可能是RSpec中的错误,而不是Rails中的错误。

答案 1 :(得分:1)

我在

中解决了类似问题的类似问题
RAILS_APP/config/initializers/my_custom_file.rb

require 'mylibfile' # it will load file found in lib/mylibfile.rb

此解决方案允许在应用程序启动期间加载自定义库