28

En rieles, puedo obtener el nombre del controlador actual a través de nombre_controlador y la acción actual llamando a nombre_actitud. Estoy buscando una reflexión en tiempo de ejecución similar para obtener lo siguiente:¿Cómo obtener la lista de controladores y acciones en ruby ​​on rails?

  1. Lista de todos los controladores en la aplicación.
  2. Lista de todas las acciones en un controlador determinado.

Por ejemplo, I un controlador de producto que tiene acciones "agregar" y "editar". ¿Puedo ver los nombres de estas acciones programáticamente para mostrarle al usuario qué operaciones son compatibles?

He visto un método que requiere el uso de ActionController::Routing::Routes.named_routes.routes.each pero no pude conseguir que funcione. Obtuve el error ActionDispatch::Routing::Routes constante no inicializado cuando lo usé.

Si hay algún buen tutorial o documento que me ayude a comprender cómo funciona la reflexión del riel. Lo busqué pero casi siempre tengo blogs activos relacionados con la reflexión de registros. Estoy buscando algo que me permita obtener información sobre controladores y acciones/métodos en tiempo de ejecución.
Gracias,

Tabrez

+0

¿Está haciendo esto en tiempo de ejecución o en un trabajo de rake. tiempo de ejecución es una mala idea. El trabajo de rastrillo es fácil de hacer. – drhenner

+0

¿Te refieres a "rutas de rake"? Estaba buscando algo en tiempo de ejecución. No necesito la extensa información que rake las salidas de rutas. Solo necesito los nombres de los controladores, que supongo que deben estar disponibles como una colección. Ser un novato a los rieles, simplemente no sé qué objetos de contexto son accesibles en los rieles en tiempo de ejecución. – Tabrez

+0

Encontré una pregunta similar aquí, http://stackoverflow.com/questions/1564278/how-to-programmatically-list-all-controllers-in-rails – nkm

Respuesta

92

La forma más fácil de obtener una lista de clases de controlador es:

ApplicationController.descendants 

Sin embargo, como las clases se cargan con pereza, que tendrá que cargar con ganas todas sus clases antes tu hiciste esto. Tenga en cuenta que este método llevará tiempo, y va a ralentizar el arranque:

Rails.application.eager_load! 

para obtener todas las acciones en un controlador, utilice action_methods

PostsController.action_methods 

Esto devolverá un Set que contiene una lista de todos los métodos en su controlador que son "acciones" (usando la misma lógica que utiliza Rails para decidir si un método es una acción válida para enrutar).

+0

Eso es exactamente lo que estaba buscando. ¡Muchas gracias! ¿Hay algún recurso/guía/libro de rieles particular que pueda ayudar a entender este tipo de asuntos? más específicamente, el ciclo de vida de la página y los objetos en tiempo de ejecución por los que pasan los rieles? Cualquier apuntador será de gran ayuda ya que soy nuevo en los rieles. – Tabrez

+1

Vale la pena mencionarlo llamando '.action_methods' solo obtienes la lista de métodos públicos (= acciones) definidos en una clase. Dado que Rails puede representar una plantilla sin un método real en el controlador, posiblemente puede generar un agujero de seguridad en la aplicación. –

1

PostsController.action_methods devolverá todas las acciones de PostsController incluyendo heredada, no es lo que quiero, me encontré con PostsController.instance_methods(false), que devolverá todos los métodos de instancia de PostsController y no incluir heredada, exactamente lo que quiero.