如何访问gem代码中的类名

时间:2015-02-27 18:51:24

标签: ruby-on-rails ruby gem rubygems

所以我创建了一个acts_as类型的gem,并且在gem内部我希望引用包含gem的类,以使用其名称定义方法,例如

class MyObject < ActiveRecord::Base
  acts_as_whatever
end

我想使用该类的名称来定义gem中的方法

module LocalInstanceMethods
  define_method "other_#{something.name.underscore.pluralize}" do
  end
end

我应该放置什么而不是something,以便创建一个名为other_my_objects的方法?

PS :调用self引用我在其中的模块

ActsAsWhatever::LocalInstanceMethods

self.class

Module

2 个答案:

答案 0 :(得分:0)

在您的模块中,您需要included实施。

module LocalInstanceMethods
  def self.included(other)
    class << other
     define_method "other_#{self.class.name.underscore.pluralize}" do
       # ...
     end
    end
  end
end

当代码包含在大多数模块中时,此代码将以other作为该模块混合的模块执行。然后打开该类并在 it 上定义方法,而不是在模块上定义方法并将该方法混合到主机模块中。

答案 1 :(得分:0)

好的,我想出来了,@ ChrisHeald的回答接近正确,但是一个小细节搞砸了,这对我有用

module LocalInstanceMethods
  def self.included(klass)
    define_method "other_#{klass.name.underscore.pluralize}" do
    end
  end
end

部分class < klass混淆了selfklass个变量,现在没有它klass是我想要的实际模型,所以klass.name返回我想要定义的方法所需的字符串。

我还花了一段时间注意到它是def self.included而不是included do块,这部分搞砸了我的所有测试。