0

我有一个 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定义常量。

在更一般的意义上,我想要实现的是:

  1. 为继承自的类实现默认行为的分组方法ActionController::Base

  2. 能够覆盖并添加到类定义中的那些方法

  3. 动态获取特定类的分组方法列表

编辑:回答Deefour关于我为什么要这样做:

我正在创建一个 CLI 菜单来环绕控制器。它接受用户的输入来调用控制器方法。菜单直接从控制器收集方法,从而定义有效的命令/输入。

我想要的是定义一个新的封装级别,一个新的访问说明符,一个公共方法的子集,可以通过 CLI 菜单访问。

我可以通过为所有菜单可用的方法创建一个前缀来实现这一点,但我也试图掌握 ruby​​ 的内部工作原理。

4

1 回答 1

0

我想到了:

动作控制器扩展:

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

这似乎暂时有效。如果有人有任何替代/更好的方法,我很乐意看到他们。此外,如果有任何重大警告或与惯例冲突,请告诉我。

于 2012-08-19T15:52:55.557 回答