我有一个 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 的内部工作原理。