2012-05-05 8 views
6
> rvm list 
rvm rubies 

=* ruby-1.9.2-p290 [ i686 ] 
    ruby-1.9.3-p194 [ i686 ] 

> rails -v 
Rails 3.1.1 

relacionada, pero no se contestaron: Is there a Rails Console command (Rails 3+) to reload changed code?¿cómo recargo un modelo en la consola de rieles?

estoy usando los rieles de la consola para tratar de averiguar por qué un método en mi modelo no está siendo llamado. El modelo está en ./app/models/product.rb. Estoy cambiando un método para que no se llame como self.trim_history a trim_history. Todavía me estoy volviendo loco cuando llamar a un método como self.do_stuff o simplemente do_stuff.

Bueno, en el curso de resolver esto me he encontrado con un problema con reload!. Según entendí, reload! cargaría todos los modelos y controladores nuevamente, pero eso no parece funcionar. Cuando depuro mi código, la línea que he cambiado para ser do_stuff todavía se muestra como self.do_stuff en el depurador.

He intentado resolver esto con reload!, no hay solución. He vuelto a cargar el objeto de la base de datos después de volver a cargar, sin solución. He cargado el modelo directamente con load './app/models/product.rb', luego he cargado el objeto desde el archivo db, no hay solución. He verificado que el objeto se está cambiando con tail.

¿Cuál es la mejor manera de volver a cargar un modelo en la consola de rieles? ¿Debo reiniciar la consola cada vez que cambia mi código de modelo? ¿Hay alguna forma de simplemente volcar todos los modelos existentes y su código sin volver a cargar la consola?

Editar: esto se extrañó. Ahora sospecho que mi código está siendo recargado pero el depurador no refleja el nuevo código. Cuando paso por el código, el código anterior está allí, pero el nuevo código se está ejecutando. Probé esto agregando un raise - el raise nunca aparece en el depurador, pero se muestra. Wat?

¿Hay algo que tenga que hacer con el depurador para que vea el código recargado? Esto parece un error ...

+1

¿Está tratando de llamar al método en la clase o una instancia de la clase? –

+0

@ChrisSchmitz instancia de la clase; Estoy leyendo acerca de usarme y jugar con el código hasta que lo entiendo. – jcollum

+0

Hay varios depuradores diferentes para Ruby, sería útil especificar cuál está usando. –

Respuesta

16

reload! no reinicializa los objetos existentes, simplemente vuelve a cargar el código. Si crea una nueva instancia de la clase, debe reflejar los cambios.

+0

esto está cubierto en OP, ¿quizás no estoy creando el objeto de la forma en que estás pensando? Lo estoy creando al cargarlo desde el archivo db: 'p = Product.by_name 'Acme Mop'' - esto está llamando' Product.where (name: name) .first' - ¿podría ser ese el problema? – jcollum

+0

@jcollum No está diciendo que * cómo * se crean es relevante, sino * cuando *. ¿Estás creando los objetos antes o después de llamar a 'reload!'? –

+0

@AndrewMarshall de nuevo, cubierto en el PO. Estoy cargando el objeto desde el archivo db después de llamar a 'reload!' Y los cambios en el código no se reflejan en el objeto – jcollum

Cuestiones relacionadas