2011-09-30 14 views
6

W moim Rails 3.1 app (z Ruby 1.9), mam Deployer1 klasy, która jest w pracownika podkatalogu poniżej modelu kataloguJak dynamicznie ładować klasę przy użyciu przestrzeni nazw/podkatalogu w Ruby/Rails?

próbuję załadować/instancję tej klasy dynamicznie z tego Kod:

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

Gdybym nie nazw stosowania, np coś takiego: globalny

class Deployer1 
end 

Następnie działa poprawnie (deployer_class = "Deployer1") - może załadować klasę i utworzyć obiekt.

Gdy próbuję i umieścić go w module do niego nieco przestrzeni nazw tak:

module Worker 
    class Deployer1 
    end 
end 

nie robi praca (deployer_class = „Pracownik :: Deployer1”) - daje błąd o brakującym stała, co, jak sądzę, oznacza, że ​​nie może znaleźć klasy.

mogę otworzyć klasę generalnie w moim kodu Rails w sposób statyczny (Worker :: Deployer1.new) - tak Rails jest poprawnie skonfigurowany, aby załadować ten, być może wczytuję to w niewłaściwy sposób ...

EDIT: tak, jak za odpowiedź Vlada, rozwiązanie poszedłem na to:

deployer_class.constantize.new 

Dzięki Chris

Odpowiedz

14

spróbuj constantize zamiast:

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

Dzięki Vlad - właśnie tego potrzebowałem. –

4

Object nie zna stałej o nazwie Worker::Deployer1, dlatego Object.const_get 'Worker::Deployer1' nie działa. Object zna tylko stałą Worker. Co to jest praca Worker.const_get 'Deployer1'.

Odpowiedź Vlad Khomisch działa, ponieważ jeśli spojrzysz na implementację constantize, to właśnie to robi: dzieli łańcuch na '::' i rekursywnie const_get.

+0

Fajnie - dzięki za to. Muszę trochę zagłębić się w Ruby Klasy i stałe :) –

Powiązane problemy