2011-09-30 12 views
6

En mis Rails 3.1 aplicación (con Ruby 1.9), tengo una clase Deployer1 que está en un trabajador subdirectorio por debajo de la modelo directorio¿Cómo cargar dinámicamente la clase utilizando espacios de nombres/subdirectorio en Ruby/Rails?

Estoy tratando de cargar/crear instancias de esta clase de forma dinámica con esta código:

clazz = item.deployer_class # deployer_class is the class name in a string 
    deployer_class = Object.const_get clazz 
    deployer = deployer_class.new 

Si yo no espacios de nombres, por ejemplo, el uso de algo global como esta:

class Deployer1 
end 

Entonces funciona bien (deployer_class = "Deployer1") - puede cargar la clase y crear el objeto.

Si lo intento y lo puse en un módulo de espacio de nombres que sea un poco, de esta manera:

module Worker 
    class Deployer1 
    end 
end 

Es no funciona (deployer_class = "Trabajador :: Deployer1") - da un error por perder constante, lo cual creo que significa que no puede encontrar la clase.

puedo acceder a la clase en general, en mi código de rieles de una manera estática (Trabajador :: Deployer1.new) - por lo que los carriles está configurado correctamente para cargar esto, tal vez Estoy cargando el camino equivocado ...

EDIT: Así, de acuerdo con la respuesta de Vlad, la solución fui a es:

deployer_class.constantize.new 

Gracias Chris

Respuesta

14

intentar usar constantize lugar:

module Wtf 
    class Damm 
    end 
end 
#=> nil 
'Wtf::Damm'.constantize 
#=> Wtf::Damm 
Object.const_get 'Wtf::Damm' 
#=> Wtf::Damm 
+0

Gracias Vlad - justo lo que necesitaba. –

4

Object no conoce una constante llamada Worker::Deployer1, por lo que Object.const_get 'Worker::Deployer1' no funciona. Object solo conoce una constante Worker. Lo que funciona es Worker.const_get 'Deployer1'.

obras respuesta de Vlad Khomisch, porque si nos fijamos en la implementación de constantize, esto es exactamente lo que hace: divide la cadena en '::' y de forma recursiva const_get 's.

+0

Cool - gracias por eso. Debo profundizar un poco más en las clases y constantes de Ruby :) –

Cuestiones relacionadas