所以我创建了一个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
答案 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
混淆了self
和klass
个变量,现在没有它klass
是我想要的实际模型,所以klass.name
返回我想要定义的方法所需的字符串。
我还花了一段时间注意到它是def self.included
而不是included do
块,这部分搞砸了我的所有测试。