rails query ruby-on-rails ruby-on-rails-3 reflection methods controller

query - ¿Cómo obtener una lista de controladores y acciones en ruby on rails?



rails controller (2)

En los rieles, puedo obtener el nombre del controlador actual a través de controller_name y la acción actual llamando a action_name. Estoy buscando un tiempo de reflexión similar para buscar lo siguiente:

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

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

He observado un método que requiere el uso de ActionController::Routing::Routes.named_routes.routes.each pero no pude lograr que funcionara. Recibí un ActionDispatch::Routing::Routes constante de ActionDispatch::Routing::Routes inicializar 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


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

ApplicationController.descendants

Sin embargo, como las clases se cargan perezosamente, tendrás que cargar todas tus clases antes de hacer esto. Tenga en cuenta que este método tomará tiempo y ralentizará su arranque:

Rails.application.eager_load!

Para obtener todas las acciones en un controlador, use action_methods

PostsController.action_methods

Esto devolverá un Set 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).


PostsController.action_methods devolverá todas las acciones de PostsController incluido el heredado, no es lo que quiero, encontré PostsController.instance_methods(false) , que devolverá todos los métodos de instancia de PostsController y no incluirá hereditario, exactamente lo que quiero.