从ActionController扩展获取方法名称

时间:2012-08-19 10:12:46

标签: ruby-on-rails ruby activerecord actioncontroller

我有一个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. 动态获取特定类的分组方法列表

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

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

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

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

1 个答案:

答案 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

这似乎现在正在起作用。如果有人有任何替代/更好的方法,我很乐意看到他们。如果对公约有任何重大警告或冲突,请告诉我。