2009-10-14 5 views
22

実際に多くの種類の構成可能なオブジェクトを管理するためにRESTfulなアプリケーションを構築しようとしています。したがって、大量の "リソース"タイプがあります。私はまだPOC段階にあるので、すべてのコントローラを最初のナビゲーションページに表示できるといいですね。Railsにすべてのコントローラをプログラムでリストする方法

答えて

5

グーグル:「レールリストコントローラの

最初の結果。

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

の場合コントローラーとアクションをリストするつもりですが、なぜレーキルートを使用しないのですか?出力が乱雑ですが、それは端末ウィンドウを拡張することで修正されています。 – EmFi

+0

私はちょうどリンクがやっていたものに似ているクイックコードを置いていた。少し練習するので、私は覚えています。 – Jim

22
ApplicationController.subclasses 

は、それはあなたが始められるでしょう..私のリンクからのコードは次のように簡単に行うことができると思いますが、開発モードでは、実際にロードされているものだけが表示されるため、あまり表示されないことに注意してください。プロダクションモードで起動すると、すべてのコントローラの一覧が表示されます。 Railsの3.1以上で

+4

"#{RAILS_ROOT}/app/controllers"内のすべてのファイルに開発モードでリストを入力させることができます。 – EmFi

+0

これは実動モードでは動作しますが、開発モードでは動作しないことに注意してください。コントローラが遅延ロードされているためです。レールコンソールモードであなたのアプリを起動し、サブクラス/子孫を見ると、あなたは何も見えません。コントローラの名前を入力すると、指定されたクラスがサブクラスとして表示されます。 ActiveAdminはこれで良い仕事をしているようです... GitHubでコードをチェックしたいかもしれません。 – Raels

+0

これは完全な解決策ではありません。なぜなら、すべてのコントローラを取得せず、AplicationControllerの直接的なサブクラスのみを取得するからです。階層内に2つのレベルの入れ子がある場合は、それらをすべてガートすることはありません。代わりにApplicationController.descendantsを使用してください。また、ロード時にすべてのコントローラを取得するには、Rails.application.eager_loadを使用できます。あなたの開発環境やテスト環境のイニシャライザでは、すべてのレールアプリケーションを読み込んでブートを遅くし、副作用があることに気づくでしょう。 –

38

:あなたのroutes.rbをファイルにそのパスを持っている場合

Rails.application.routes 

これはあなたのすべてのコントローラ、アクションとそのルートを提供します。例えば

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 

アップデート: はまだレール4.2.7ために働きます。あなたは、コントローラのサブクラス(例えばContactPageController継承からを持っている場合は、@ JDLの方法は、それが失敗した多くの状況で動作しますが(実際の質問あたり)コントローラのリストを抽出するには、単にコントローラと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/ railsは開発モードのサーバー情報のためのinbuiltルートを作成するが、そのルートを見つけることは、読者のための練習に残っていることに気づいた。 – nurettin

9

を抽出することができますApplicationControllerを継承するPageController)。

したがって、より良い方法が使用することです:

::ApplicationController.descendants 

routesを使用すると、部品はエンジンとして抽象化され、複雑なアプリを持っている場合、これらは非表示になります動作しない場合があります。

+0

アクティブな管理者のサブクラスでは機能しませんでしたが、あなたの作品は!ありがとうございました – Fedcomp

6

私は特に

ApplicationController.subclasses 

@jdlソリューションを気に入っしかし、私は本当にアンダースコア形式ですべてのコントローラ名を必要に応じて私の場合、(私はサブディレクトリなど必要はありません。/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] } 
関連する問題