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

时间:2009-10-14 04:44:08

标签: ruby-on-rails

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

7 个答案:

答案 0 :(得分:43)

在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

答案 1 :(得分:23)

ApplicationController.subclasses

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

答案 2 :(得分:10)

虽然@ jdl的方法在许多情况下都有效,但是如果你有控制器子类(例如ContactPageController继承自PageController继承自ApplicationController),它将失败。

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

::ApplicationController.descendants

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

答案 3 :(得分:6)

我特别喜欢@jdl解决方案

ApplicationController.subclasses

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

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

答案 4 :(得分:5)

Google:'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

答案 5 :(得分:2)

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

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

答案 6 :(得分:2)

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

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

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

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