Как получить список контроллеров и действий в рубине на рельсах?
В рельсах я могу получить имя текущего контроллера через имя_контроллера и текущее действие, вызвав action_name. Я ищу аналогичное отображение времени выполнения для получения следующих результатов:
- Список всех контроллеров в приложении.
- Список всех действий в данном контроллере.
Например, я контроллер продукта, который "добавляет" и "редактирует" действия. Могу ли я программно отображать имена этих действий, чтобы показать пользователю, какие операции поддерживаются?
Я рассмотрел метод, который требует использования ActionController::Routing::Routes.named_routes.routes.each
но я не мог заставить это работать. Я использовал неинициализированную постоянную ошибку ActionDispatch::Routing::Routes
, когда я ее использовал.
Если есть хороший учебник или документ, которые могут помочь мне понять, как функции отражения рельсов. Я искал его, но в основном у меня были активные блоги, связанные с отражением записи. Я ищу что-то, что позволяет мне получать информацию о контроллерах и действиях/методах во время выполнения.
Спасибо,
Tabrez
Ответы
Ответ 1
Самый простой способ получить список классов контроллеров:
ApplicationController.descendants
Однако, поскольку классы загружаются лениво, вам нужно будет загружать все ваши классы, прежде чем делать это. Имейте в виду, что этот метод потребует времени, и это замедлит вашу загрузку:
Rails.application.eager_load!
Чтобы получить все действия в контроллере, используйте action_methods
PostsController.action_methods
Это вернет Set
, содержащий список всех методов в вашем контроллере, которые являются "действиями" (используя ту же логику, которую использует Rails, чтобы решить, является ли метод действительным действием для маршрутизации).
Ответ 2
PostsController.action_methods
вернет все действия PostsController
, включая унаследованные, это не то, что я хочу, я нашел PostsController.instance_methods(false)
, который вернет все методы экземпляра PostsController
и не включит унаследованные, что именно я хочу.