2011-04-30 43 views
0

我見過幾個地方,其中*_without_*方法被引用在寶石中,而我沒有看到它們被定義在哪裏。這裏有兩個來自validationgroupdelayed_jobs寶石的例子。Rails gems中的這些「無」方法在哪裏被定義?

  1. validation_group.rb,有一種方法add_with_validation_group定義了,關於其最後一行的引用add_without_validation_group;但是,add_without_validation_group似乎沒有在任何地方定義。

    def add_with_validation_group(attribute, 
               msg = @@default_error_messages[:invalid], *args, 
               &block) 
        add_error = true 
        if @base.validation_group_enabled? 
        current_group = @base.current_validation_group 
        found = ValidationGroup::Util.current_and_ancestors(@base.class). 
         find do |klass| 
         klasses = klass.validation_group_classes 
         klasses[klass] && klasses[klass][current_group] && 
         klasses[klass][current_group].include?(attribute) 
         end 
        add_error = false unless found 
        end 
        add_without_validation_group(attribute, msg, *args,&block) if add_error 
    end 
    
  2. 在DelayedJob的message_sending.rb,動態傳遞方法的參數被稱爲#{method}_without_send_later。但是,我只看到#{method}_with_send_later正在這個寶石的任何地方被定義。

    def handle_asynchronously(method) 
        without_name = "#{method}_without_send_later" 
        define_method("#{method}_with_send_later") do |*args| 
        send_later(without_name, *args) 
        end 
        alias_method_chain method, :send_later 
    end 
    

所以我的觀點是,有一些神奇的Rails我與這些失蹤的「無」的方法。但是,我似乎無法弄清楚在Google搜索什麼來自己回答問題。

回答

4

這就是alias_method_chain正在爲您提供。

基本上當你說

alias_method_chain :some_method, :feature 

您提供了兩種方法:

some_method_with_feature 
some_method_without_feature 

什麼情況是,當原始some_method被調用時,它實際上調用some_method_with_feature。然後你得到some_method_without_feature這是你原來的方法聲明(即回退/默認行爲)的參考。所以,你要定義some_method_with_feature實際做的東西,正如我說的,是當你打電話叫some_method

例子:

def do_something 
    "Do Something!!" 
end 

def do_something_with_upcase 
    do_something_without_upcase.upcase 
end 

alias_method_chain :do_something, :upcase 

do_something # => "DO SOMETHING!!" 

參見文檔here

+0

真棒,謝謝您!! – 2011-04-30 23:49:29

相關問題