2010-04-02 11 views
8

Hey abbiamo una classe di libreria (lib/Mixpanel) che chiama lavoro ritardato come segue:Rails Delayed Job & Libreria di classi

class Mixpanel 

    attr_accessor :options 
    attr_accessor :event 

    def track!() 
    .. 
    dj = send_later :access_api # also tried with self.send_later 
    .. 
    end 

    def access_api 
    .. 
    end 

Il problema è che quando si corre lavori rake: il lavoro: si ottiene la seguente errore:

undefined method `access_api' for #<YAML::Object:0x24681b8> 

Qualsiasi idea del perché?

+0

Sembra che il lavoro in ritardo non conosca la classe della libreria in modo che diventi solo un YAML :: Object, mi spiace non so come si possa caricare la classe della libreria. – Corey

+0

Ho notato che questo problema esiste con tutto ciò che non è un modello 'ActiveRecord'. Il mio PORO è in 'app/models' e normalmente è caricato automaticamente da Rails. 'delayed_job' sembra avere un problema con esso, a meno che non utilizzi la soluzione di inizializzazione descritta di seguito da Jonathan. –

risposta

15

Delayed_job carica sempre automaticamente le classi ActiveRecord, ma non conosce altri tipi di classi (come la lib) che ha eseguito il marshalling nel db come YML. Quindi, è necessario attivare esplicitamente il programma di caricamento classi per loro. Dal momento che DJ si avvia l'ambiente Rails, basta parlare di qualsiasi non-AR marshalling classi in un inizializzatore:

(config/initializers/load_classes_for_dj.rb) 

Mixpanel 
+0

Grazie, anche questo mi ha aiutato! Nota per i moduli: utilizzare "include ModelName" – vfilby

2

Un piccolo Gotcha, ho seguito il suggerimento di Jonathan, ma avevo bisogno di aggiungere un require prima che il nome della classe, così ho 'd usare questo per load_classes_for_dj.rb:

require 'mixpanel' 
Mixpanel 

Poi ha funzionato benissimo!

+0

Avendo config.autoload_paths + =% W (# {config.root}/lib) in config/application.rb richiederebbero tutte le classi in lib nel caso in cui si abbiano molti file require =) – Abdo

Problemi correlati