查看 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 中所做的更改,以了解如何让这些受影响的验证方法再次工作。