我見過幾個地方,其中*_without_*
方法被引用在寶石中,而我沒有看到它們被定義在哪裏。這裏有兩個來自validationgroup
和delayed_jobs
寶石的例子。Rails gems中的這些「無」方法在哪裏被定義?
在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
在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搜索什麼來自己回答問題。
真棒,謝謝您!! – 2011-04-30 23:49:29