2013-11-23 48 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

有谁知道我如何从这两个文件的实例和类方法使用受保护的方法,这将是一个很大的好处?