2011-05-16 53 views
2

我正在嘗試編寫一個自定義驗證器來檢查輸入到文本字段中的單詞數量。在Rails 3中編寫自定義驗證器

我試圖按照railscasts情節例如211 - http://railscasts.com/episodes/211-validations-in-rails-3

所以我做了一個文件/lib/word_limit_validator.rb在本教程中相同的代碼複製。我知道這段代碼不會計算單詞的數量,我只是想使用它,因爲我知道它應該如何表現。

class WordLimitValidator < 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 

下面是我在驗證中使用的線:

validates :body, :presence => true, 
        :word_limit => true 

當我試圖加載我得到了以下錯誤的形式:

Unknown validator: 'word_limit'

如何讓軌道識別我的驗證器?

系統規格: 的Mac OS 10.6.7 的Rails 3.0.4 紅寶石1.9.2p136

回答

1

文件中的lib /不在的Rails了自動加載。所以,你有幾個選擇。

  • 您可以在application.rb中添加的lib到您的自動加載路徑:通過添加文件,像這樣來配置/初始化
    config.autoload_paths += %W(#{config.root}/lib)
  • 可以包括: require File.join(Rails.root, 'lib', 'word_limit_validator')
  • 如果你只需要它只是一個地方,你可以把它放在與你的模型相同的文件中。
+0

我用第二個選項,它的工作! – Cyrus 2011-05-16 23:31:00

+0

是的,我應該說 - 第二個選擇是IMO最好的選擇。不確定Rails 3的「最佳實踐」是什麼。 – muffinista 2011-05-16 23:41:29

10

你也可以創建一個應用程序/驗證器目錄在你的Rails項目,並把你的自定義驗證那裏。這樣他們會自動加載。

+0

它的工作原理,但...當我改變'app/validators/*。rb'中的內容Rails(或Spork)不重載代碼。一個快速的解決方法是在'Guardfile'中添加另一個'watch'行。 – 2012-04-23 13:53:35