2012-07-13 10 views
7

Tengo un código de Rails que no encaja perfectamente en un modelo o caja de control. Entonces, según this answer, creé un directorio app/classes. Rails 3 parece agregar esto automáticamente a la "ruta de carga" en Rails, y mi aplicación encuentra correctamente las clases que defino allí sin necesidad de utilizar las declaraciones require.Rails 3.2.x: cómo volver a cargar el directorio de aplicaciones/clases durante el desarrollo?

Sin embargo, el código en app/classes no se vuelve a cargar en el modo de desarrollo; si realizo un cambio, necesito reiniciar el servidor para ver ese cambio.

¿Cuál es la forma correcta de hacer que un directorio determinado sea "recargable" en Rails 3.2.x? Unas pocas respuestas aquí recomiendo hacer:

config.autoload_paths += %W(#{config.root}/app/classes) 

pero yo creo que esto simplemente tiene el efecto de añadir app/classes para el conjunto inicial de directorios para encontrar el código en; no parece hacerlos recargables para cada solicitud (y además en 3.x parece que se agrega automáticamente app/*).

actualización:

figuras, yo tropezamos con la solución a tan sólo 30 segundos después de la publicación de la pregunta: ¿

me había envuelto mi clase dentro de un módulo. Una vez que eliminé el "MyModule" que lo rodeaba, de repente se volvió recargable. Procedente de un fondo Java, y habiendo sido quemado por código Ruby que contamina el espacio de nombres global, he desarrollado el hábito de poner todo dentro de un módulo. Supongo que el código de "aplicación" de Rails debe vivir fuera de cualquier módulo.

+3

Intenta crear un subdirectorio bajo 'classes' con el nombre de tu módulo, y luego coloca todas las clases del módulo allí. Sospecho que si se cambia un archivo llamado 'bar.rb', solo se vuelve a cargar si se usa la clase' Bar', pero no si el nombre completo es 'Foo :: Bar' - entonces buscaría un archivo llamado 'foo/bar.rb' para volver a cargar. Sólo una suposición, sin embargo. – Thilo

Respuesta

2

¿Declaraste el módulo en un archivo separado o lo declaraste implícitamente dentro de la clase? Esto podría tener un efecto en el comportamiento de autocarga. module Foo; class Bar contra class Foo::Bar. Es posible que si el autocargador Rails no puede encontrar un foo.rb para ir con el módulo Foo, podría saltearse la recarga.

+0

El módulo se declaró en el mismo archivo como: Módulo Foo; clase Bar, y luego se hace referencia en todo el código como Foo :: Bar. –

+0

Puede valer la pena tratar de tener un archivo de módulo separado solo para que haya una asociación 1: 1 entre clases/módulos y archivos. – tadman

Cuestiones relacionadas