Ruby on rails Rails:基于模块/关注点中的父类名称动态定义类方法
我想根据包含此Mixin的类名在Mixin中动态生成一个类方法 这是我目前的代码: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
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