2011-09-11 78 views
1

aliassing的方法在一個插件我寫我使用別名來覆蓋默認的Rails的驗證,像這樣的一個:的respond_to結合在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?

謝謝你的幫助。
Erwin

+0

你試過定義一個調用別名的實際方法嗎? –

+0

'scoped_validates_uniqueness_of'是一個'private'方法嗎? – yfeldblum

+0

@Jessice:這實際上是問題,這是一種私人方法。感謝您指點我正確的方向。如果你把它作爲答案發布,我會很樂意接受它。 – ErwinM

回答

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)

返回true如果OBJ響應給定的方法。只有當可選的第二個參數評估爲true時,私有方法才包含在搜索中。