2009-10-14 16 views
22

Estoy intentando construir una aplicación RESTful para administrar realmente muchos tipos de objetos configurables, por lo que hay una gran cantidad de tipos de "recursos" y, por lo tanto, una gran cantidad de controladores. Todavía estoy en la fase POC, por lo que sería bueno si puedo mostrar todos los controladores en una primera página de navegación, por lo que cualquier forma fácil (programable) para hacer eso?Cómo enumerar programáticamente todos los controladores en Rails

Respuesta

5

Google:

primer resultado 'carriles controladores de la lista'.

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


Después de aprender acerca de las subclases, creo que el código de mi enlace podría hacerse simplemente como ..

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

Si vas a enumerar controladores y acciones, ¿por qué no utilizar rutas de rake? Seguro que la salida es desordenada, pero eso se soluciona ampliando la ventana de tu terminal. – EmFi

+0

Acabo de escribir un código rápido que sería similar a lo que estaba haciendo el enlace. Practicando un poco, así lo recuerdo. – Jim

22
ApplicationController.subclasses 

que va a empezar, pero tenga en cuenta que en el modo de desarrollo no verá mucho, ya que solo le mostrará lo que realmente se ha cargado. Enciéndalo en modo de producción, y debería ver una lista de todos sus controladores.

+4

Puede solicitar todos los archivos en "# {RAILS_ROOT}/app/controllers" para completar su lista en modo de desarrollo. – EmFi

+0

Es importante tener en cuenta que esto funciona en modo de producción, pero no en modo de desarrollo, ya que los controladores se cargan de forma perezosa. Encienda su aplicación en el modo de consola de rieles y mire las subclases/descendientes y no verá ninguna. Escriba el nombre de uno de los controladores, y luego la clase nombrada aparecerá como una subclase. ActiveAdmin parece hacer un buen trabajo en esto ... es posible que desee verificar su código en GitHub. – Raels

+0

Esta no es una solución completa porque no obtiene todos los controladores, solo subclases directas de AplicationController. Si tiene dos niveles de anidación en su jerarquía, no los obtendrá. Use ApplicationController.descendientes en su lugar. Y para obtener todos los controladores en el momento de la carga, puede usar Rails.application.eager_load! en los inicializadores del entorno de desarrollo o prueba, pero tenga en cuenta que cargará todas las aplicaciones de raíles y puede ralentizar el inicio y tener efectos secundarios. –

38

En Rails 3.1 +:

Rails.application.routes 

Esto le dará todos los controladores, las acciones y sus rutas si tiene sus caminos en su archivo routes.rb.

Por ejemplo:

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

Actualización: para los carriles 3.2, motor de ruta Diario cambiado, por lo que el código se convierte en:

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 

Actualización: Todavía trabajando para los rieles 4.2.7. Para extraer la lista de controladores (por pregunta real), sólo tiene que extraer el controlador y uniq

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

Aquí están mis fuentes: 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 También me di cuenta de que los rieles crean una ruta incorporada para la información del servidor del modo de desarrollo, pero encontrar esa ruta se deja como un ejercicio para el lector. – nurettin

9

Mientras @ método de JDL trabajará en una serie de situaciones se produce un error si tiene subclases controlador (por ejemplo ContactPageController hereda de PageController que hereda de ApplicationController).

Por lo tanto un mejor método es utilizar:

::ApplicationController.descendants 

Usando routes puede no funcionar si usted tiene una aplicación compleja en la que las partes se abstraen como los motores, éstos estarán ocultas.

+0

subclases no funcionó para el administrador activo pero su trabajo! gracias – Fedcomp

6

Me gustó especialmente @jdl solución

ApplicationController.subclasses 

Pero en mi caso, en el que realmente necesitaba todos los nombres de los controladores en formato de guión bajo (no tengo subdirectorios por ejemplo: /admin) que utilizó la siguiente:

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" } 

Esto nos da el nombre exacto del controlador tal como aparece en el archivo de controlador.

2

Otra solución (si estás en 5 carriles) y en el desarrollo y la necesidad de asignar controladores y acciones:

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

puede rechazar [: en la residencia] si es necesario:

.reject { |route| route[:internal] } 
Cuestiones relacionadas