Rails 3自定义验证器应该存放在哪里?

96

我看过文档/网站,显示自定义验证器应该放在项目的/lib/lib/validators目录中。通过阅读另一篇帖子的答案,我发现它们似乎只能在config/initializers中工作。有人知道或有指向官方文档的指针,显示自定义验证器应该放在哪里吗?

我建议将自定义验证器放在/app/validators目录下,这是Rails应用程序的标准位置。您可以在此处创建一个新的Ruby类并定义自定义验证方法。然后,在模型中使用validates_with方法并引用您的自定义验证器类。


4个回答

223

如果您将自定义验证器放在app/validators中,则无需修改config/application.rb文件,它们将被自动加载。


我不知道是否需要添加一些宝石/配置来解决这个问题,在Rails 3.2.8下这是行不通的。具体来说,只是简单地将你的验证器放在app/validators/ ??? .rb中是不起作用的。 - Doug
17
Doug试图以同样的方式命名验证器文件,即将验证器类名用下划线连接,并放置于app/validators/my_cool_validator.rb中。例如,MyCoolValidator将会对应my_cool_validator.rb文件。我会尽最大努力使翻译更加准确、通顺。 - equivalent8
14
@Doug,你需要重新启动服务器。autoload路径在初始化时被扩展,因此新的子文件夹直到你这样做之前才会被捕捉到。 - Timo
我喜欢对ActiveModel :: Validations :: HelperMethods进行monkeypatch,以添加新验证的帮助程序(例如AddressValidator的validates_address)。当我在app / validators / address_validator.rb中包含monkeypatch和验证器时,只加载AddressValidator对象,而不是monkeypatch。你们有同样的经历吗? - jshkol
1
在Rails 5.2中,我需要执行 spring stop 命令,否则修改不会生效。 - Jack Kinsella

15
如果您将以下内容添加到/config/application.rb文件中:
config.autoload_paths += %W["#{config.root}/lib/validators/"]

Rails会在启动时自动加载您的验证器(就像/config/initializers/一样),但您可以保持干净的结构,将验证器放在一个好的、易于命名的位置。


10
好主意,但你的代码需要进行一些清理: config.autoload_paths += %W(#{config.root}/lib/validators/) 注:该代码会将路径添加到Rails应用程序的自动加载路径中。 - aNoble

6

lib/validators 看起来是最干净的。但是您可能需要在模型加载之前加载它们,所以最好从初始化程序中加载。


4

这里是关于自定义验证的官方文档。据我所知,将其保留在相关模型中是一个很好的实践。


5
除非它们适用于多个模型,否则您应该将它们保存在其他地方以保持DRY。 - Andrew Marshall
这也是它们被创建为单独的类的原因,否则就没有必要创建一个单独的类了。 - Jakub Hampl
7
@Jakub,是的,有的:单一职责原则。 - mattwynne
2
官方文档的链接已失效。以下是该文件的当前位置; http://guides.rubyonrails.org/active_record_validations.html#custom-validators - Stijnster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接