2010-04-02 4 views
8

Эй у нас есть библиотека классов (Библиотека/Mixpanel), который вызывает замедленную работу следующим образом:Rails отложенной работы и библиотеки класса

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 

Проблема заключается в том, что, когда мы запускаем работу граблей: работа: мы получаем следующее ошибка:

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

Любая идея, почему?

+0

Кажется, что отложенная работа не знает о вашем классе библиотеки, поэтому он просто становится объектом YAML :: Object, извините, я не знаю, как вы можете загрузить его в библиотечный класс. – Corey

+0

Я заметил, что эта проблема существует во всем, что не является моделью ActiveRecord. Мой PORO находится в 'app/models' и, как правило, он автоматически загружается Rails. 'delayed_job', похоже, имеет проблему с этим, если я не воспользуюсь решением инициализатора, описанным ниже Джонатаном. –

ответ

15

Delayed_job всегда автозагружает классы ActiveRecord, но не знает о других типах классов (например, lib), которые он маршалировал в db как YML. Таким образом, вам нужно явно запустить загрузчик классов для них. Так как ди-джей запускает среду Rails, просто говоря любую не-AR выстраивала классы в инициализаторе:

(config/initializers/load_classes_for_dj.rb) 

Mixpanel 
+0

Спасибо, это тоже помогло мне! Примечание для модулей: используйте «include ModelName» – vfilby

2

Небольшой глюк, я последовал предложение Джонатана, но мне нужно, чтобы добавить require перед именем класса, так что я «d использовать это для load_classes_for_dj.rb:

require 'mixpanel' 
Mixpanel 

Затем он работал отлично!

+0

Если config.autoload_paths + =% W (# {config.root}/lib) в config/application.rb потребует всех классов в lib, если у вас есть много файлов для require =) – Abdo