如何以编程方式列出Rails中的所有控制器

我正在尝试构建一个RESTful应用程序来实际管理多种可配置对象,因此存在大量“资源”类型,因此有很多控制器。 我还处于POC阶段,如果我能在第一个导航页面中显示所有控制器,那将会很好,所以任何简单的方法(可编程)都可以做到这一点?

在Rails 3.1+中:

Rails.application.routes 

如果您在routes.rb文件中有路径,这将为您提供所有控制器,操作及其路由。

例如:

 routes= Rails.application.routes.routes.map do |route| {alias: route.name, path: route.path, controller: route.defaults[:controller], action: route.defaults[:action]} end 

更新:对于Rails 3.2,日记引擎路径已更改,因此代码变为:

 routes= Rails.application.routes.routes.map do |route| {alias: route.name, path: route.path.spec.to_s, controller: route.defaults[:controller], action: route.defaults[:action]} end 

更新:仍然适用于Rails 4.2.7。 要提取控制器列表(每个实际问题),您只需提取控制器和uniq

 controllers = Rails.application.routes.routes.map do |route| route.defaults[:controller] end.uniq 
 ApplicationController.subclasses 

它会让你开始,但请记住,在开发模式中你不会看到太多,因为它只会显示实际加载的内容。 在生产模式下启动它,您应该看到所有控制器的列表。

虽然@jdl的方法可以在许多情况下工作,但如果你有控制器子类,它就会失败(例如, ContactPageControllerinheritance自inheritance自ApplicationController PageController )。

因此,更好的方法是使用:

 ::ApplicationController.descendants 

如果您有一个复杂的应用程序,其中部件被抽象为引擎,则使用routes可能无效,这些将被隐藏。

我特别喜欢@jdl解决方案

 ApplicationController.subclasses 

但在我的情况下,我真正需要下划线格式的所有控制器名称(我没有子目录,例如: /admin )我使用了以下内容:

 Dir[Rails.root.join('app/controllers/*_controller.rb')].map { |path| path.match(/(\w+)_controller.rb/); $1 }.compact 

谷歌:’rails list controllers’

第一个结果。

http://snippets.dzone.com/posts/show/4792


在了解了子类之后,我认为我的链接中的代码可以简单地完成。

 ApplicationController.subclasses.each do |c| puts "Controller: #{c}" puts "Actions: #{c.constantize.action_methods.collect{|a| a.to_s}.join(', ')}" end 
 Dir[Rails.root.join('app/controllers/*_controller.rb')].map { |path| (path.match(/(\w+)_controller.rb/); $1).camelize+"Controller" } 

这为我们提供了控制器文件中出现的控制器的确切名称。

另一个解决方案(如果您在Rails 5中)和开发中需要映射控制器和操作:

 Rails.application.routes.set.anchored_routes.map(&:defaults) 

如果需要,您可以拒绝[:internal]:

 .reject { |route| route[:internal] }