【问题标题】:Ruby Modules methods outside ClassMethodsClassMethods 之外的 Ruby 模块方法
【发布时间】:2013-11-23 21:50:54
【问题描述】:

我正在尝试了解这是如何工作的,如果有人可以帮助我,那就太好了。我有一个如下所示的模块:

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 调用来调用的。这是如何工作的?

【问题讨论】:

  • 你是否在某个地方混入了你的模块?
  • 我做include Timeline::Track,然后从我的模型track_now(:new_item, user: :pilot)调用方法,这是你的要求吗?
  • 简单地说:你不能。一个类不知道它的实例,因此“类方法”不能调用实例方法。
  • @Max 那就举个例子吧。您的回答还通过消除类方法 track_now 完全掩盖了它。
  • 你是对的。我的错。

标签: ruby activesupport


【解决方案1】:

您似乎想从类方法中调用实例方法。我不建议你这样做,但如果你真的想要,你可以尝试如下:

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

【讨论】:

    【解决方案2】:

    最后我创建了一个新文件track_now.rb,它是track.rb 的副本,但将所有方法都设为ClassMethod

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 2021-10-08
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多