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