在模型实例上使用动态模型验证帮助程序方法



查看 ActiveModel::Validations 的 rails 源代码,HelperMethods 模块既包含在底层模型中,又进行了扩展:

module Validations
  extend ActiveSupport::Concern
  included do
    extend ActiveModel::Callbacks
    extend ActiveModel::Translation
    extend  HelperMethods
    include HelperMethods
...

从理论上讲,这不仅允许您将 validates_presence_of 等帮助程序方法作为类宏调用(如所有标准示例中所示),还可以直接在模型实例上调用这些帮助程序方法:

myobject.validates_presence_of :name

我可以看到这很有用的地方是在想要利用一些现有帮助程序方法的自定义验证器的上下文中:

class CustomValidator < ActiveModel::Validator
  def validate(record)
    record.validates_presence_of :name
    record.validates_acceptance_of :terms
    ...
  end
end

无论这是否是鼓励的行为,它似乎确实有效,直到 Rails 4.1 中的特定验证器进行了一些更改。所以我的问题是,如果 rails 不支持以这种方式调用这些辅助方法(作为模型上的实例方法),为什么它们包含在模型中而不仅仅是扩展?

因此,根据大约 4 年前的提交,确实有意使这些验证帮助程序可以从类和实例中调用:

https://github.com/rails/rails/commit/9131a88bb8e82f139ec49b4057fb6065ba0a2c6a

我正在评估 4.1 中所做的更改,以了解如何让这些受影响的验证方法再次工作。

最新更新