Respond_to与Rails中的方法相结合

时间:2011-09-11 20:24:16

标签: ruby-on-rails ruby ruby-on-rails-3.1

在我正在编写的插件中,我使用别名来覆盖其中一个默认的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?

感谢您的帮助 欧文

1 个答案:

答案 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时,才会在搜索中包含私有方法。