28

レールでは、現在のコントローラの名前をcontroller_nameで取得し、現在のアクションはaction_nameを呼び出して取得できます。私は、次のものをフェッチするための類似のランタイムリフレクションを探しています:ruby​​ on railsでコントローラーとアクションのリストを取得するには?

  1. アプリケーション内のすべてのコントローラのリスト。
  2. 特定のコントローラ内のすべてのアクションのリスト。

たとえば、私は「追加」アクションと「編集」アクションを持つProductコントローラです。これらのアクションの名前をプログラムでプルダウンして、どの操作がサポートされているかをユーザーに表示できますか?

私はActionController::Routing::Routes.named_routes.routes.each を使用する方法を検討しましたが、動作させることができませんでした。私はそれを使用したときに、初期化されていない定数ActionDispatch::Routing::Routesエラーが発生しました。

レールリフレクションの機能を理解するのに役立つ良いチュートリアルやドキュメントがある場合は、私はそれを探しましたが、主に積極的な記録反映ブログがありました。私は実行時にコントローラとアクション/メソッドに関する情報を得ることができるものを探しています。
おかげで、

Tabrez

+0

実行時またはレイクジョブでこれを実行していますか。実行時は悪い考えです。レイクの仕事はこれをするのは簡単です。 – drhenner

+0

"レーキルート"を意味しましたか?私は実行時に何かを探していた。私はレーキルートが出力する広範な情報は必要ありません。コントローラー名が必要です。私はコレクションとして利用可能でなければならないと考えています。レールに目を向けているので、実行時にどのようなコンテキストオブジェクトがレールでアクセス可能か分かりません。 – Tabrez

+0

類似の質問がここに見つかりました。http://stackoverflow.com/questions/1564278/how-to-programmatically-list-all-controllers-in-rails – nkm

答えて

92

コントローラクラスのリストを取得する最も簡単な方法は次のとおりです。

ApplicationController.descendants 

しかし、クラスが遅延ロードされているとして、あなたは前に熱心な負荷にすべてのクラスが必要になりますこれをして。これは含むSetを返します

Rails.application.eager_load! 

は、コントローラ内のすべてのアクションを取得するには、action_methods

PostsController.action_methods 

を使用します。この方法は時間がかかりますし、それはあなたのブートが遅くなりますことを覚えておいてくださいあなたのコントローラ内にあるすべてのメソッドのリストを "アクション"(Railsがメソッドをルーティングする有効なアクションかどうかを判断するのに使用するのと同じロジックを使用)。

+0

それはまさに私が探していたものでした。どうもありがとう!これらのタイプの問題を理解するのに役立つレール/リソースガイド/ブックがありますか?より具体的には、レールが通過するページライフサイクルとランタイムオブジェクト私はレールに慣れていないので、どんなポインタも大きな助けになるでしょう。 – Tabrez

+1

これは 'を呼び出すことで言及する価値があります。action_methods'では、クラス内で定義されているパブリックメソッド(= actions)のリストのみを取得します。 Railsはコントローラ内に実際のメソッドを持たずにテンプレートをレンダリングすることができるため、アプリケーションにセキュリティホールが発生する可能性があります。 –

1

PostsController.action_methodsは継承を含めPostsControllerのすべてのアクションを返しますが、それは私が欲しいものではありません、私はPostsControllerなく含め、私が欲しい、まさに、継承されたすべてのインスタンスメソッドを返します。これは、PostsController.instance_methods(false)を発見しました。

関連する問題