2010-12-16 23 views
10

Quiero agregar un método a un modelo de Rails, que se utilizará en las pruebas. Si hago estoRuby/Rails: reapertura vs sobreescritura de una clase

class Model 
    def something_new 
    do_something 
    end 
end 

en la consola de Rails o en un archivo cargado en tiempo de ejecución, Modelo se sobrescribe en lugar de modificar. Si pongo algo como v = Model.class antes de las líneas de arriba, el nuevo método se agrega con éxito a la clase existente. Aparentemente, la referencia es necesaria para indicar que una clase existente se está reabriendo.

Por otro lado, se puede agregar un método a, digamos, Fixnum sin tener que consultarlo primero. ¿Qué está pasando aquí y cuál es la forma habitual de garantizar que una clase existente se vuelva a abrir y modificar en lugar de sobrescribir?

Gracias.

Respuesta

11

Parece que no necesita la clase antes de usarla. Cuando escribe Model.class y no hay clase de modelo, Rails automágicamente trae el modelo por usted. Si solo escribe class Model, simplemente lo ve como una definición de clase. Solo haciendo require 'model' debería funcionar.

+0

Gracias, ese era el problema. Cuando vi que la clase Model ya estaba reconocida, no me di cuenta de que solo se reconocía "automágicamente". –

4

Use class_eval, de esta manera estará reabriendo la clase de la manera correcta.
Aquí hay un artículo muy bueno en reopening classes.

+0

Gracias. Es un buen artículo. –

Cuestiones relacionadas