在我正在编写的插件中,我使用别名来覆盖其中一个默认的Rails验证器,如下所示:
# Alias the original validator so it's still available under a different name
alias original_validates_uniqueness_of :validates_uniqueness_of unless method_defined?(:original_validates_uniqueness_of)
# Then alias the custom validator under the original name
alias validates_uniqueness_of :custom_validates_uniqueness_of
这一切都很好。当在AR模型中的属性上定义“validates_uniqueness_of”时,它将使用我的“custom_validates_uniqueness_of”方法。验证按预期运行。
然而,当我打电话时:
SomeARclass.respond_to?(:validates_uniqueness_of)
..它将返回false。这种行为会混淆几种流行的插件。
我的问题:
为什么respond_to返回“false”?这种行为是否是联盟的结果?如何调整我的自定义验证器以使其返回true?
感谢您的帮助 欧文
答案 0 :(得分:0)
表面上的样品看起来应该有效。我希望您已经发现,在class SomeARclass
的班级内部,您实际上可以拨打validates_uniqueness_of
。
class SomeARclass
validates_uniqueness_of :first_field # works
end
但是,我希望scoped_validates_uniqueness_of
是一种私有方法。这就是为什么你无法从班级机构外部向SomeARclass
发送该邮件的原因。
SomeARclass.validates_scoped_uniqueness_of :first_field # fails
#=> NoMethodError: private method "validates_scoped_uniqueness_of" called
for SomeARclass:Class
当您使用新名称为私有方法设置别名时,例如使用新名称validates_scoped_uniqueness_of
别名私有方法validates_uniqueness_of
,那么该新方法也是私有的。我希望这就是这里发生的事情。
#respond_to?
的文档内容为:
- (Boolean) respond_to?(symbol, include_private = false)
如果 obj 响应给定方法,则返回
true
。仅当可选的第二个参数的计算结果为true
时,才会在搜索中包含私有方法。