2011-12-31 103 views
28

在rails中,我可以通过controller_name获取当前控制器的名称,通过调用action_name获取当前操作的名称。我正在寻找类似的运行时反射来获取以下内容:如何获取控制器列表和Ruby on Rails的操作?

  1. 应用程序中所有控制器的列表。
  2. 给定控制器中所有操作的列表。

例如,我是具有“添加”和“编辑”动作的产品控制器。我可以通过编程方式获取这些操作的名称,以向用户显示哪些操作受支持?

我看了一个方法,要求使用ActionController::Routing::Routes.named_routes.routes.each 但我无法得到它的工作。当我使用它时,我得到了未初始化的常量ActionDispatch::Routing::Routes错误。

如果有什么好的教程或文档可以帮助我理解rails反射功能如何。我搜索了它,但我主要是积极记录反思相关的博客。我正在寻找一些能让我在运行时获得有关控制器和动作/方法的信息。
谢谢,

Tabrez

+0

你是在运行时还是在耙耙工作中这样做。运行时间是一个坏主意。耙工很容易做到这一点。 – drhenner 2011-12-31 05:37:35

+0

你的意思是“耙路线”?我在运行时正在寻找一些东西。我不需要获取路线输出的大量信息。我只需要控制器名称,我认为它必须作为集合提供。作为rails的noob,我只是不知道在运行时可以在rails中访问哪些上下文对象。 – Tabrez 2011-12-31 06:52:06

+0

在这里找到类似的问题,http://stackoverflow.com/questions/1564278/how-to-programmatically-list-all-controllers-in-rails – nkm 2011-12-31 07:17:47

回答

92

得到控制类的列表的最简单方法是:

ApplicationController.descendants 

然而,由于类延迟加载,你需要贪婪加载所有的班前你做这个。请记住,这种方法会需要时间,这将你​​的启动变慢:

Rails.application.eager_load! 

要获得在控制器中的所有动作,使用action_methods

PostsController.action_methods 

这将返回包含一个Set你的控制器中所有的方法都是“操作”的列表(使用Rails用来决定一个方法是否是一个有效的路由行为的逻辑)。

+0

这正是我所期待的。非常感谢!是否有任何特别的资源/指南/书籍可能有助于理解这些类型的问题;更具体地说,轨道所经历的页面生命周期和运行时对象?任何指针将是一个巨大的帮助,因为我是新的轨道。 – Tabrez 2011-12-31 11:38:38

+1

值得一提的是,通过调用'。action_methods'你只能得到在类中定义的公共方法(=动作)的列表。由于Rails可以在控制器中不使用实际方法来渲染模板,因此它可能会导致应用程序中出现安全漏洞。 – 2015-03-03 07:27:51

1

PostsController.action_methods将返回PostsController所有行动,包括继承,这不是我想要的,我发现PostsController.instance_methods(false),将返回的PostsController所有实例的方法,而不是包括被继承的,正是我想要的。