Ruby on rails Rails:基于模块/关注点中的父类名称动态定义类方法

Ruby on rails Rails:基于模块/关注点中的父类名称动态定义类方法,ruby-on-rails,ruby,module,metaprogramming,mixins,Ruby On Rails,Ruby,Module,Metaprogramming,Mixins,我想根据包含此Mixin的类名在Mixin中动态生成一个类方法 这是我目前的代码: module MyModule extend ActiveSupport::Concern # def some_methods # ... # end module ClassMethods # Here is where I'm stuck... define_method "#{self.name.downcase}_status" do

我想根据包含此Mixin的类名在Mixin中动态生成一个类方法

这是我目前的代码:

module MyModule  
  extend ActiveSupport::Concern  

  # def some_methods  
  #   ...  
  # end  

  module ClassMethods  

    # Here is where I'm stuck...
    define_method "#{self.name.downcase}_status" do  
      # do something...  
    end  

  end  
end  

class MyClass < ActiveRecord::Base  
  include MyModule  
end  

# What I'm trying to achieve:
MyClass.myclass_status
在方法定义中获取基类名称是有效的(self,self.name…),但我无法使它对方法名称有效

到目前为止,我已经试过了

define_method "#{self}"
define_method "#{self.name"
define_method "#{self.class}"
define_method "#{self.class.name}"
define_method "#{self.model_name}"
define_method "#{self.parent.name}"
但这一切似乎都不管用:/

是否有任何方法可以检索基类名称(不确定如何调用包含模块的类)。我已经为这个问题挣扎了好几个小时,但我似乎无法找到一个干净的解决方案:(


谢谢!

您不能这样做-目前还不知道哪个类(或多个类)包含该模块

如果您定义了一个
self.included
方法,则每次包含模块时都会调用该方法,执行包含操作的内容将作为参数传递。或者,由于您使用的是as::Concern,因此可以执行以下操作:

included do 
  #code here is executed in the context of the including class
end

您可以这样做:

module MyModule
  def self.included(base)
    (class << base; self; end).send(:define_method, "#{base.name.downcase}_status") do
      puts "Hey!"
  end

  base.extend(ClassMethods)
end

  module ClassMethods
    def other_method
      puts "Hi!"
    end
  end
end

class MyClass
  include MyModule
end

MyClass.myclass_status
MyClass.other_method
模块MyModule
def自带(基本)

(类用于
扩展

module MyModule  
  def self.extended who
    define_method "#{who.name.downcase}_status" do
      p "Inside"
    end
  end
end  

class MyClass  
  extend MyModule  
end  

MyClass.myclass_status

我找到了一个干净的解决方案:使用
define_singleton_方法
(在ruby v1.9.3中提供)


谢谢你的解释。我在
包含的do#…end
块中使用了
define#u singleton_方法
:define#u singleton_方法#{self.name}状态“do#…end
`
module MyModule  
  def self.extended who
    define_method "#{who.name.downcase}_status" do
      p "Inside"
    end
  end
end  

class MyClass  
  extend MyModule  
end  

MyClass.myclass_status
module MyModule  
  extend ActiveSupport::Concern  

  included do
    define_singleton_method "#{self.name}_status" do
      # do stuff
    end
  end

  # def some_methods  
  #   ...  
  # end  

  module ClassMethods  
    # Not needed anymore!
  end  
end