查看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不支持以这种方式调用这些辅助方法(作为模型上的实例方法),为什么它们包含在模型中而不是仅仅扩展?
答案 0 :(得分:0)
所以根据大约4年前的这个提交,确实有意让这些验证助手从类和实例中调用:
https://github.com/rails/rails/commit/9131a88bb8e82f139ec49b4057fb6065ba0a2c6a
我正在评估4.1中所做的更改,以了解如何让这些受影响的验证方法再次运行。