2010-04-02 14 views
8

Hey tenemos una clase de biblioteca (lib/Mixpanel) que llama trabajo retardada de la siguiente manera:rieles retardada de empleo y la biblioteca de clases

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 

El problema es que cuando nos encontramos puestos de trabajo del rastrillo: el trabajo: se obtiene la siguiente error:

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

¿Alguna idea de por qué?

+0

Parece que el trabajo retrasado no sabe acerca de la clase de su biblioteca, por lo que se convierte en un YAML :: Objeto, lo siento, no sé cómo puede conseguirlo cargar su clase de biblioteca. – Corey

+0

Me di cuenta de que este problema existe con cualquier cosa que no sea un modelo 'ActiveRecord'. Mi PORO está en 'app/models' y, normalmente, es autocargado por Rails. 'delayed_job' parece tener un problema, a menos que use la solución de inicializador que se describe a continuación por Jonathan. –

Respuesta

15

Delayed_job siempre carga automáticamente las clases de ActiveRecord, pero no conoce otros tipos de clases (como lib) que se han clasificado en el db como YML. Por lo tanto, debe activar explícitamente el cargador de clases para ellos. Desde DJ pone en marcha el entorno de Rails, justo mencionar cualquier no-AR calculan las clases en un inicializador:

(config/initializers/load_classes_for_dj.rb) 

Mixpanel 
+0

¡Gracias, esto me ayudó también! Nota para los módulos: use "include ModelName" – vfilby

2

Una pequeña gotcha, que siguió la sugerencia de Jonathan, pero tenía que añadir un require antes de que el nombre de la clase, por lo que que utilizar esto para load_classes_for_dj.rb:

require 'mixpanel' 
Mixpanel 

Luego trabajó muy bien!

+0

Tener config.autoload_paths + =% W (# {config.root}/lib) en config/application.rb requeriría todas las clases en lib en caso de que tenga muchos archivos para require =) – Abdo

Cuestiones relacionadas