Подтвердить что ты не робот

Как получить список контроллеров и действий в рубине на рельсах?

В рельсах я могу получить имя текущего контроллера через имя_контроллера и текущее действие, вызвав action_name. Я ищу аналогичное отображение времени выполнения для получения следующих результатов:

  • Список всех контроллеров в приложении.
  • Список всех действий в данном контроллере.

Например, я контроллер продукта, который "добавляет" и "редактирует" действия. Могу ли я программно отображать имена этих действий, чтобы показать пользователю, какие операции поддерживаются?

Я рассмотрел метод, который требует использования ActionController::Routing::Routes.named_routes.routes.each но я не мог заставить это работать. Я использовал неинициализированную постоянную ошибку ActionDispatch::Routing::Routes, когда я ее использовал.

Если есть хороший учебник или документ, которые могут помочь мне понять, как функции отражения рельсов. Я искал его, но в основном у меня были активные блоги, связанные с отражением записи. Я ищу что-то, что позволяет мне получать информацию о контроллерах и действиях/методах во время выполнения.
Спасибо,

Tabrez

4b9b3361

Ответ 1

Самый простой способ получить список классов контроллеров:

ApplicationController.descendants

Однако, поскольку классы загружаются лениво, вам нужно будет загружать все ваши классы, прежде чем делать это. Имейте в виду, что этот метод потребует времени, и это замедлит вашу загрузку:

Rails.application.eager_load!

Чтобы получить все действия в контроллере, используйте action_methods

PostsController.action_methods

Это вернет Set, содержащий список всех методов в вашем контроллере, которые являются "действиями" (используя ту же логику, которую использует Rails, чтобы решить, является ли метод действительным действием для маршрутизации).

Ответ 2

PostsController.action_methods вернет все действия PostsController, включая унаследованные, это не то, что я хочу, я нашел PostsController.instance_methods(false), который вернет все методы экземпляра PostsController и не включит унаследованные, что именно я хочу.