2009-10-14 74 views
22

我試圖建立一個RESTful應用到實際管理許多種配置的對象,所以有大量的「資源」類型的,因此很多控制器。我仍然處於POC階段,所以如果我可以在第一個導航頁面顯示所有控制器,那麼很簡單(可編程)就可以做到這一點?如何以編程方式列出Rails的所有控制器

回答

5

Google:'軌道列表控制器'

第一個結果。

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 
+1

如果你將列出控制器和操作,爲什麼不使用rake路由?確保輸出很混亂,但是通過擴展終端窗口來解決這個問題。 – EmFi 2009-10-14 07:33:27

+0

我只是放下了類似於鏈接所做的快速代碼。我記得有點練習。 – Jim 2009-10-14 08:00:34

22
ApplicationController.subclasses 

這將讓你開始,但請記住,在開發模式中,您不會看到太多內容,因爲它只會顯示實際加載的內容。在生產模式下啓動它,您應該看到所有控制器的列表。

+4

您可以要求「#{RAILS_ROOT}/app/controllers」中的所有文件以開發模式填充您的列表。 – EmFi 2009-10-14 05:49:48

+0

重要的是要注意,這是工作在生產模式,但不是在開發模式,因爲控制器是懶惰地加載。在Rails控制檯模式下啓動您的應用程序,並查看子類/後代,您將看不到任何內容。輸入其中一個控制器的名稱,然後命名的類將顯示爲子類。 ActiveAdmin似乎在這方面做得很好......您可能想要在GitHub上查看他們的代碼。 – Raels 2014-01-23 13:05:10

+0

這不是一個完整的解決方案,因爲它沒有得到所有控制器,只有AplicationController的直接子類。如果你在層次結構中有兩個層次的嵌套,你就不會把所有的嵌套在一起。改爲使用ApplicationController.descendants。並且爲了在加載時獲得所有控制器,您可以使用Rails.application.eager_load!在您的開發或測試環境初始化程序中,但要注意它會加載所有的rails應用程序,它會減慢啓動併產生任何副作用。 – 2017-02-02 08:56:41

38

在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 

更新: 對於滑軌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 
+0

以下是我的來源: https://github.com/rails/rails/blob/master/railties/lib/rails/tasks/routes.rake https://github.com/rails/rails/blob/ master/railties/lib/rails/application/route_inspector.rb 我也意識到rails爲開發模式服務器信息創建了一個內置路由,但是發現該路由僅供讀者使用。 – nurettin 2012-05-11 13:37:23

9

雖然@ JDL的方法將在若干情況下工作,如果你有控制器子類(例如,從ContactPageController繼承失敗PageController,其繼承自ApplicationController)。

因此更好的方法是使用:

::ApplicationController.descendants 

使用,如果你有一個複雜的應用程序,其中部分被抽象爲引擎routes可能無法正常工作,這些將被隱藏。

+0

子類不適用於活動管理員,但您的作品!謝謝 – Fedcomp 2016-06-30 10:46:45

6

我特別喜歡@jdl解決方案

ApplicationController.subclasses 

但在我的情況下,如果我真的需要在下劃線格式的所有控制器的名字(我沒有子目錄如:/admin)我用下面的:

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

這爲我們提供了控制器的確切名稱,因爲它出現在控制器文件中。

2

另一種解決方案(如果你在Rails中5),並在發展和需要映射控制器和動作:

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

你可以拒絕[:內部]如果需要的話:

.reject { |route| route[:internal] } 
相關問題