【问题标题】:Add class methods for custom acts_as为自定义acts_as添加类方法
【发布时间】:2015-04-16 08:18:49
【问题描述】:

我想在调用acts_as 方法时动态添加类方法。我的文件结构如下(取自http://guides.rubyonrails.org/plugins.html):

module ActsAsFoo
  extend ActiveSupport::Concern

  included do
  end

  module ClassMethods
    def acts_as_foo(options = {})
      include ActsAsFoo::LocalInstanceMethods
    end
  end

  module LocalInstanceMethods
    def instance_method
      # This method works without any issue
    end
  end
end

class Bar
  acts_as_foo
end

我希望能够在类调用acts_as_foo 时声明类方法。实例方法适用于LocalInstanceMethods。最简单的方法是添加到模块中,但我所有的其他类也有这个方法。我已经尝试将define_method 添加到acts_as 方法中,返回未定义的方法。有什么想法吗?

【问题讨论】:

  • 你想给Bar添加类方法还是实例方法?您的问题是类方法,但该模块称为LocalInstanceMethods
  • @Slicedpan 我不清楚。我重写了我的问题。我可以毫无问题地添加本地实例,但不能添加类方法。

标签: ruby-on-rails ruby-on-rails-4 activesupport-concern


【解决方案1】:

我认为您只需要创建第二个子模块并使用extend 而不是include

module ActsAsFoo
  extend ActiveSupport::Concern

  included do
  end

  module ClassMethods
    def acts_as_foo(options = {})
      extend ActsAsFoo::LocalClassMethods
    end
  end

  module LocalClassMethods
    def class_method
      # class method definition
    end
  end
end

class Bar
  acts_as_foo
end

【讨论】:

    猜你喜欢
    • 2019-06-18
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多