2010-07-14 63 views
2

我有一个验证器为EmailValidator和类用户:Rails3:validates_with,我应该把MyValidator放在什么地方?

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.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) 

但是,如果我把用户定义之前的EmailValidator定义在user.rb中,就像在上面的例子中那样就没关系。

在什么地方我应该把EmailValidator?

回答

4

你应该能够把它放在lib/email_validator.rb最新的Rails 3 HEAD,并自动加载。

您是否在使用旧版本?

在短暂的时间内(即直到提交被恢复),lib中的文件没有被自动加载 - 我相信这仍然是目标,但实现是错误的,所以现在修改已经恢复。为了安全起见,完全向前兼容,下面一行添加到您的config/application.rb

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

或者,如果代码工作使用你的应用程序时,但没有运行RSpec的时候,那么这可能是在RSpec的一个bug,而比在Rails中。

1

我解决了类似的问题,把这样的事情在

RAILS_APP/config/initializers/my_custom_file.rb 

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

该解决方案pemits应用程序在启动时加载自定义库

+0

这是错误吗?这不是本地的灵魂...... – petRUShka 2010-07-14 12:23:21

+0

不知道这个在rails3中,我知道在轨道2.3中的文件lib /在应用程序的某些部分使用时是懒加载的。顺便解决了我的问题:P – 2010-07-14 12:31:00

+0

关于运行RSpec的问题,我遇到了同样的问题。将Rails.root添加到我的路径中,一切正常:config.autoload_paths + =%W(#{Rails.root}/lib/initializers) – 2010-12-17 03:40:26

相关问题