Rails Custom Delayed Job — неинициализированная константа

Я успешно использую delayed_job уже пару лет, но недавно у меня возникла необходимость реализовать какой-то обратный вызов/хуки успеха/неудачи.

Следуя руководству delayed_job на github, я настроил следующее пользовательское задание:

class XmlImportJob < Struct.new(:file, :supplier_id, :user_id, :directory)
  def perform
    Product.xml_import(file, supplier_id, user, directory)
  end

  def success(job)
    ProductMailer.xml_import_complete.deliver
  end

  def failure(job)
    ProductMailer.xml_import_failed.deliver
  end
end

Например, при запуске этого с Delayed::Job.enqueue XmlImportJob.new(secure_url, 1, 1, directory) я получаю ошибку Job failed to load: uninitialized constant XmlImportJob..

Я попытался сохранить свою пользовательскую работу, которая находится в файле с именем xml_import.rb в разделе app/jobs и lib, и я получаю ту же ошибку.

На данный момент я только пытался запустить это через консоль рельсов. Даже при явном вызове require 'xml_import', который возвращает true, я получаю ту же ошибку.

Кто-нибудь, у кого есть опыт успешного использования пользовательских delayed_jobs, знает, что я здесь делаю?


person Raoot    schedule 05.12.2013    source источник
comment
Мы успешно использовали DelayedJobs — работает очень похоже на Resque. Я думаю, ваша проблема в том, что XMLImportJob не является объектом очереди? Я могу ошибаться здесь, но я уверен, что вам нужно создать какую-то очередь, которую вы затем можете добавить в DelayedJob?   -  person Richard Peck    schedule 05.12.2013
comment
Спасибо, я посмотрю. Я думаю, также может быть, что класс XmlImportJob' but the file is just xml_import.rb' также, что приложение/работы не загружаются автоматически.   -  person Raoot    schedule 05.12.2013
comment
Да, интуиция такова, что, поскольку это не в типичной области модели (т.е. вы манипулируете файлом), возможно, DelayedJob нужно что-то для вызова файла XmlImportJob :)   -  person Richard Peck    schedule 05.12.2013
comment
Это было так, как я думал! Забавно, как описание проблемы здесь может иногда заставить вас увидеть, что не так.   -  person Raoot    schedule 05.12.2013
comment
:) Дай мне знать, как дела!!   -  person Richard Peck    schedule 05.12.2013


Ответы (1)


Чтобы ответить на мой собственный вопрос;

Любые пользовательские каталоги с классами и модулями, которые вы хотите сделать автозагружаемыми, должны быть добавлены в config/application.rb следующим образом:

config.autoload_paths += %W(
  #{config.root}/app/jobs
)

Файлы, содержащиеся в этих папках, должны быть названы в соответствии с соглашениями rails, поэтому XmlImportJob находится в xml_import_job.rb.

person Raoot    schedule 05.12.2013