2010-04-02 8 views
8

Hey wir eine Bibliothek Klasse (lib/Mixpanel), die verzögerte Job ruft wie folgt:Rails Verzögerte Job & Library Klasse

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 

Das Problem ist, dass, wenn wir Rechen-Jobs laufen: Arbeit: Wir erhalten die folgende Fehler:

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

Irgendeine Idee warum?

+0

Scheint wie der verzögerte Auftrag nicht über Ihre Bibliotheksklasse weiß, so dass es nur ein YAML :: Object wird, sorry ich weiß nicht, wie Sie es laden können Ihre Bibliotheksklasse. – Corey

+0

Ich habe festgestellt, dass dieses Problem bei allem, was kein 'ActiveRecord'-Modell ist, existiert. Mein PORO ist in 'app/models' und normalerweise wird es automatisch von Rails geladen. 'delayed_job' scheint ein Problem damit zu haben, es sei denn, ich verwende die Initialisierungslösung, die unten von Jonathan beschrieben wird. –

Antwort

15

Delayed_job lädt immer ActiveRecord-Klassen automatisch, aber es weiß nichts über andere Arten von Klassen (wie lib), die es in der db als YML gemarshallt hat. Sie müssen also explizit den Klassenlader für sie auslösen. Da DJ die Rails-Umgebung startet, erwähnen nur jede nicht-AR-Klassen in einem initializer gemarshallte:

(config/initializers/load_classes_for_dj.rb) 

Mixpanel 
+0

Danke, das hat mir auch geholfen! Hinweis für Module: Verwenden Sie "include ModelName" – vfilby

2

Ein kleiner gotcha, ich Jonathan Vorschlag gefolgt, aber ich brauchte eine require vor dem Klassennamen hinzufügen, so dass ich Würd diese verwenden für load_classes_for_dj.rb:

require 'mixpanel' 
Mixpanel 

Dann es funktionierte gut!

+0

Mit config.autoload_paths + =% W (# {config.root}/lib) in config/application.rb würde alle Klassen in lib benötigen, wenn Sie viele Dateien haben benötigt =) – Abdo

Verwandte Themen