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
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
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.
Vous pouvez exiger tous les fichiers dans "# {RAILS_ROOT}/app/controllers" pour remplir votre liste en mode développement. – EmFi
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
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. –
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
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
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.
les sous-classes ne fonctionnaient pas pour l'admin actif mais vos travaux! Je vous remercie – Fedcomp
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
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.
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] }
- 1. Hibernate Search - Comment lister tous les enregistrements par défaut
- 2. Comment puis-je lister les plugins (BHO) utilisés par Internet Explorer dans mon programme?
- 3. Rails STI Contrôleurs
- 4. Dans Rails, comment utilisez-vous les contrôleurs RESTful avec Haml?
- 5. Comment puis-je lister tous les processus s'exécutant sous Windows?
- 6. Renommer les contrôleurs dans Rails et nettoyer le contenu généré
- 7. Comment lister les fichiers installés par un Windows Installer donné?
- 8. Comment rechercher par programme tous les Baudrates disponibles en C# (classe serialPort)
- 9. Les contrôleurs de rails sont-ils multithreadés? Thread.exclusive dans les contrôleurs
- 10. Comment lister tous les noms de mois, par ex. pour un combo?
- 11. Liste tous les types déclarés par module dans Ruby
- 12. Rails: Comment trouver() tous les enregistrements uniques dans certains champs?
- 13. Zend framework code commun pour tous les contrôleurs
- 14. Comment puis-je lister tous les champs d'un objet dans Objective-C?
- 15. Enregistrez-vous tous les contrôleurs dans le conteneur Château programmatiques Windsor de tous assemblys
- 16. Contrôleurs Admin dans Merb
- 17. Comment supprimer par programme tous les éléments de la corbeille de deuxième niveau dans SharePoint 2007?
- 18. Comment lister tous mes check-ins en utilisant ClearCase?
- 19. Comment lister tous les ordinateurs et la dernière fois qu'ils ont ouvert une session dans AD?
- 20. Comment lister tous les déclencheurs dans une base de données MySQL?
- 21. Comment puis-je lister tous les fichiers tga dans un répertoire (non récursif) en Python?
- 22. Comment garder les contrôleurs hors de xib
- 23. Lister les fichiers par la dernière date de modification
- 24. Désactiver tous les sons du programme
- 25. Comment puis-je lister les types définis par l'utilisateur dans une base de données SQL Server?
- 26. Comment obtenir les Etats-Unis par programme?
- 27. Comment puis-je déterminer par programme quelles méthodes ont été déclarées comme méthodes "auxiliaires" par un contrôleur dans Rails?
- 28. Comment puis-je lister tous les dépôts avec la directive SVNParentPath sur Apache + SVN?
- 29. Rails Associations, habtm? Polymorphe? Tous les deux?
- 30. Comment nommer les contrôleurs Asp.net Mvc?
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
Je mettais juste du code rapide qui serait similaire à ce que le lien faisait. Pratiquer un peu donc je me souviens. – Jim