2013-11-23 50 views
0

我試圖理解這是如何工作的,如果有人可以幫助我會很棒。我有一個模塊,它看起來像下面:ClassMethods之外的Ruby模塊方法

module Activity::Track 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def track_now(name, options={}) 
     add_activity activity(verb: name) 
    end 
    end 

    protected 

    def activity(options={}) 
    end 

    def add_activity(activity_item) 
    end 
end 

我在做什麼在呼喚從我的模型,這是很好的和行之有效的方法track_now,但我不能調用add_activityactivity方法。我不知道如何從ClassMethods模塊中調用它們。有人可以解釋我如何做到這一點?

我在另一個項目中看到了這個,但是通過創建一個define_method然後通過send :after_create :define_method來調用這個保護方法。這個怎麼用?

+0

你是否在某處混入了你的模塊? – user2422869

+0

我做'包括Timeline :: Track',然後從我的模型track_now(:new_item,user :: pilot)調用該方法,這是你要求的嗎? – Peter

+0

簡單地說:你不能。一個類不知道它的實例,因此「類方法」不能調用一個實例方法。 –

回答

0

看來你想調用一個類方法的實例方法。我不建議你這樣做,但如果你真的願意,你可以嘗試如下:

def track_now(name, options={}) 
    self.new.instance_eval {add_activity activity(verb: name)} 
end 
0

最後,我創建了一個新的文件track_now.rb這是的track.rb重複,但把所有的方法ClassMethod

有誰知道我如何從這兩個文件的實例和類方法使用受保護的方法,這將是一個很大的好處?