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:
- Lista de todos los controladores en la aplicación.
- 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.