我有一个验证器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?
答案 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
此解决方案允许在应用程序启动期间加载自定义库