2011-05-16 55 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