У меня была похожая проблема;в моем случае это было для написания тестовых контроллеров.Есть определенные базовые тесты, которые я хочу запускать при каждом действии для определенных контроллеров (например, вернуть 401, если пользователь не вошел в систему).Проблема с решением action_methods заключается в том, что он выбирает все методы класса контроллера, даже если у метода нет соответствующего маршрута в config / rout.rb.
Вот что я в итоге сделал:
def actions_for_controller(controller_path)
route_defaults = Rails.application.routes.routes.map(&:defaults)
route_defaults = route_defaults.select { |x| x[:controller] == controller_path }
route_defaults.map { |x| x[:action] }.uniq
end
Итак, если бы вы хотели список действий для PostsController, вы бы сказали:
actions_for_controller('posts')
И вы получите:
['show', 'create', 'edit', 'destroy'] (or whatever)
Если вы хотитесписок всех контроллеров, примерно так должно это сделать:
def controllers_list
route_defaults = Rails.application.routes.routes.map(&:defaults)
files = route_defaults.map { |x| "#{x[:controller]}_controller" }.uniq
files -= ['_controller']
files.map { |x| x.split('/').map(&:camelize).join('::').constantize }
end