2009-10-14 8 views
22

J'essaie de créer une application RESTful pour gérer réellement plusieurs types d'objets configurables, donc il y a une grande quantité de types de "ressources", et donc beaucoup de contrôleurs. Je suis toujours à la phase de POC, donc ce sera bien si je peux montrer tous les contrôleurs dans une première page de navigation, donc tout moyen (programmable) pour le faire?Comment lister par programme tous les contrôleurs dans Rails

Répondre

5

Google: 'contrôleurs de liste de rails'

Premier résultat.

http://snippets.dzone.com/posts/show/4792


Après avoir appris les sous-classes, je pense que le code de mon lien pourrait être fait simplement ..

ApplicationController.subclasses.each do |c| 
    puts "Controller: #{c}" 
    puts "Actions: #{c.constantize.action_methods.collect{|a| a.to_s}.join(', ')}" 
end 
+1

Si vous allez dresser la liste des contrôleurs et des actions, pourquoi ne pas simplement utiliser des routes rake? Bien sûr, la sortie est désordonnée, mais c'est corrigé en élargissant votre fenêtre de terminal. – EmFi

+0

Je mettais juste du code rapide qui serait similaire à ce que le lien faisait. Pratiquer un peu donc je me souviens. – Jim

22
ApplicationController.subclasses 

Il va vous aider à démarrer, mais Gardez à l'esprit qu'en mode développement, vous ne verrez pas grand chose, car il ne vous montrera que ce qui a été réellement chargé. Allumez-le en mode production, et vous devriez voir une liste de tous vos contrôleurs.

+4

Vous pouvez exiger tous les fichiers dans "# {RAILS_ROOT}/app/controllers" pour remplir votre liste en mode développement. – EmFi

+0

Il est important de noter que cela fonctionne en mode production mais pas en mode développement, car les contrôleurs sont chargés paresseusement. Allumez votre application en mode console rails et regardez les sous-classes/descendants et vous n'en verrez pas. Tapez le nom de l'un des contrôleurs, puis la classe nommée apparaîtra comme une sous-classe. ActiveAdmin semble faire un bon travail à ce sujet ... vous voudrez peut-être vérifier leur code sur GitHub. – Raels

+0

Ce n'est pas une solution complète car elle n'obtient pas tous les contrôleurs, seulement les sous-classes directes de AplicationController. Si vous avez deux niveaux d'imbrication dans votre hiérarchie, vous ne pourrez pas tous les imbriquer. Utilisez plutôt ApplicationController.descendants. Et pour obtenir tous les contrôleurs au moment du chargement, vous pouvez utiliser Rails.application.eager_load! dans vos initialiseurs d'environnement de développement ou de test, mais sachez qu'il chargera toutes les applications de rails et qu'il peut ralentir le démarrage et avoir des effets secondaires. –

38

Dans Rails 3.1+:

Rails.application.routes 

Cela vous donnera tous les contrôleurs, les actions et leurs itinéraires si vous avez leurs chemins dans votre fichier routes.rb.

Par exemple:

routes= Rails.application.routes.routes.map do |route| 
    {alias: route.name, path: route.path, controller: route.defaults[:controller], action: route.defaults[:action]} 
end 

Mise à jour: Pour Rails 3.2, chemin du moteur Journal changé, le code devient:

routes= Rails.application.routes.routes.map do |route| 
    {alias: route.name, path: route.path.spec.to_s, controller: route.defaults[:controller], action: route.defaults[:action]} 
end 

Mise à jour: travaille toujours pour Rails 4.2.7. Pour extraire la liste des contrôleurs (par question réelle), vous pouvez simplement extraire le contrôleur et uniq

controllers = Rails.application.routes.routes.map do |route| 
    route.defaults[:controller] 
end.uniq 
+0

Voici mes sources: https://github.com/rails/rails/blob/master/railties/lib/rails/tasks/routes.rake https://github.com/rails/rails/blob/ master/railties/lib/rails/application/route_inspector.rb J'ai également réalisé que les rails créaient un chemin intégré pour les informations du serveur en mode développement, mais trouver cette route est un exercice pour le lecteur. – nurettin

9

Bien que @ méthode de JDL fonctionnera dans un certain nombre de situations, il échoue si vous avez des sous-classes de contrôleur (par exemple ContactPageController de inherits de PageController qui hérite de ApplicationController).

Par conséquent, une meilleure méthode consiste à utiliser:

::ApplicationController.descendants 

L'utilisation routes peut ne pas fonctionner si vous avez une application complexe où les pièces sont extraites en tant que moteurs, ceux-ci seront cachés.

+0

les sous-classes ne fonctionnaient pas pour l'admin actif mais vos travaux! Je vous remercie – Fedcomp

6

J'ai particulièrement aimé @jdl solution

ApplicationController.subclasses 

Mais dans mon cas, où je vraiment besoin de tous les noms de contrôleur au format underscore (je n'ai pas subdirs par exemple: /admin) J'utilise les éléments suivants:

Dir[Rails.root.join('app/controllers/*_controller.rb')].map { |path| path.match(/(\w+)_controller.rb/); $1 }.compact 
2
Dir[Rails.root.join('app/controllers/*_controller.rb')].map { |path| (path.match(/(\w+)_controller.rb/); $1).camelize+"Controller" } 

Cela nous donne le nom exact du contrôleur tel qu'il apparaît dans le fichier du contrôleur.

2

Une autre solution (si vous êtes dans Rails 5) et dans le développement et la nécessité de cartographier les contrôleurs et les actions:

Rails.application.routes.set.anchored_routes.map(&:defaults) 

Vous pouvez rejeter [: interne] si nécessaire:

.reject { |route| route[:internal] } 
Questions connexes