【问题标题】:Getting method names from ActionController extension从 ActionController 扩展中获取方法名称
【发布时间】: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 常量。

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

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

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

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

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

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

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

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

【问题讨论】:

  • 为什么要这样做?你能提供一个真实的例子来说明这个原因吗?可能有更好的方法来实现您所追求的目标。

标签: ruby-on-rails ruby activerecord actioncontroller


【解决方案1】:

我想通了:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    相关资源
    最近更新 更多