我有一个ActiveRecord类ActionController的扩展名:
module MyExtension
def my_method
"default implementation"
end
end
ActionController::Base.class_eval { include MyExtension }
我的所有控制器都继承自ApplicationController
,继承自ActionController::Base
。我想在继承的类
MyExtension
中的方法
class MyController < ApplicationController
module MyExtension
def my_method
"overridden implementation"
end
def my_new_method
"added method implementation"
end
end
end
然后,我想要在MyExtension中为特定的Controller类动态查找定义的方法
controller = Kernel.const_get("MyController")
methods_in_my_extension = Kernel.const_get("MyController::MyExtension").public_instance_methods
显然,这不起作用,因为没有定义MyController::MyExtension
常量。
从更广泛的意义上说,我想要实现的目标是:
实现从ActionController::Base
继承的类的默认行为的组方法
能够覆盖并添加到类定义中的那些方法
动态获取特定类的分组方法列表
编辑:回答Deefour关于我为什么要这样做:
我正在创建一个CLI菜单来环绕控制器。它需要用户输入来调用控制器方法。菜单直接从控制器收集方法,从而定义有效的命令/输入。
我想要的是定义一个新的封装级别,一个新的访问说明符,一个公共方法的子集,可以通过CLI菜单访问。
我可以通过为所有菜单可用的方法创建一个前缀来实现这一点,但我也试图抓住ruby上的内部工作。
答案 0 :(得分:0)
我明白了:
ActionControllerExtension:
module MyExtension
module MyDefaultImplementations
def my_method
"default implementation"
end
end
def get_selected_methods
default = MyDefaultImplementations.public_instance_methods
added = Kernel.const_get(self.class.name).const_get("MyImplementation").public_instance_methods
return (default + added).uniq
end
end
ActionController::Base.class_eval { include MyExtension }
控制器:
class MyController < ApplicationController
module MyImplementation
def my_method
"overridden implementation"
end
def my_new_method
"added method implementation"
end
end
include MyImplementation
end
这似乎现在正在起作用。如果有人有任何替代/更好的方法,我很乐意看到他们。如果对公约有任何重大警告或冲突,请告诉我。