【发布时间】:2012-08-19 10:12:45
【问题描述】:
我有一个 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 的内部工作原理。
【问题讨论】:
-
为什么要这样做?你能提供一个真实的例子来说明这个原因吗?可能有更好的方法来实现您所追求的目标。
标签: ruby-on-rails ruby activerecord actioncontroller