2010-07-14 61 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

相關問題