【问题标题】:Where should Rails 3 custom validators be stored?Rails 3 自定义验证器应该存储在哪里?
【发布时间】:2011-07-12 21:42:07
【问题描述】:

我看到文档/网站显示自定义验证器应该放在项目的 /lib/lib/validators 目录中。我发现(通过阅读另一篇文章的答案)他们似乎只在config/initializers 中工作。有谁知道,或者有一个官方文档的指针,显示自定义验证器应该放在哪里?

【问题讨论】:

标签: ruby-on-rails validation customvalidator


【解决方案1】:

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

【讨论】:

  • 我不知道您是否需要为此添加一些 gem/config,但是在 rails 3.2.8 下这不起作用。具体来说,简单地将验证器放入 app/validators/???.rb 是行不通的。
  • Doug 尝试以与验证器类相同但下划线的方式命名验证器文件:MyCoolValidator 转到 app/validators/my_cool_validator.rb
  • @Doug 你需要重启你的服务器。自动加载路径在初始化时扩展,因此在您这样做之前不会拾取新的子文件夹。
  • 我也喜欢猴子补丁 ActiveModel::Validations::HelperMethods 来为我的新验证添加一个助手(例如,为 AddressValidator 的 validates_address)。当我在 app/validators/address_validator.rb 中同时包含 monkeypatch 和 Validator 时,只会加载 AddressValidator 对象,而不是 monkeypatch。你们有同样的行为吗?
  • spring stop 在 Rails 5.2 中对我来说是必需的,否则不会被选中。
【解决方案2】:

如果您将此添加到您的 /config/application.rb 文件中:

config.autoload_paths += %W["#{config.root}/lib/validators/"]

Rails 会在启动时自动加载您的验证器(就像 /config/initializers/ 一样),但您可以保持将验证器放在一个漂亮且命名良好的位置的简洁结构。

【讨论】:

  • 好主意,但您的代码需要一些清理:config.autoload_paths += %W(#{config.root}/lib/validators/)
【解决方案3】:

lib/validators 似乎是迄今为止最干净的。但是,您可能需要在模型之前加载它们,因此可能来自初始化程序。

【讨论】:

    【解决方案4】:

    这是关于自定义验证的official docs。 AFAIK 将它们保留在相关模型中是一种很好的做法。

    【讨论】:

    • 除非它们适用于多个模型,在这种情况下,您应该将它们放在别处以保持干燥。
    • 它们大概是这样的,否则为它们创建单独的类毫无意义。
    • @Jakub 是的,有:单一职责原则
    • 官方文档的链接已损坏。这是该文档的当前位置; guides.rubyonrails.org/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    相关资源
    最近更新 更多