NoMethodError с delayed_job (драгоценный - PullRequest
11 голосов
/ 22 декабря 2011

ОБНОВЛЕНИЕ: было исправление для этой проблемы: https://github.com/collectiveidea/delayed_job/commit/023444424166ba2ce011bfe2d47954e79edf6798

ОБНОВЛЕНИЕ 2: Для всех, кто сталкивался с этой проблемой конкретно на Heroku, я нашел снижение до Рейка 0,8.7 и использование Delayed Job версии 2.1.4 работает, в то время как отложенная работа v3 не работает (хотя с патчем она работает на локальном компьютере).Это в стеке Bamboo-mri-1.9.2.

Я пытаюсь реализовать delayed_job в приложении rails 3.1.0 локально.Я запустил миграцию и установил файлы gem:

gem 'delayed_job'
gem 'delayed_job_active_record'

В соответствии с документацией на colleideidea github (https://github.com/collectiveidea/delayed_job). Я выполняю вызов задержки с моего контроллера следующим образом:

EventMailer.delay.event_message_email(current_user, @event_message)

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

Class#event_message_email failed with NoMethodError: undefined method `event_message_email' for Class:Class - 6 failed attempts

Я смотрел на другие вопросы об ошибках NoMethod delayed_jobна SO, но никто не решает эту конкретную ошибку или не предоставляет решение этой проблемы. На странице коллективаideidea упоминается, что этот формат без вызова метода delivery является хаком для настройки почтовых программ Rails 3, поэтому мне интересно, может быть, эта документациянасколько устарел, и если есть новый способ вызова методов почтовой программы?

Обновление: также вызов метода почтовой программы без задержки работает нормально, и я запускаю его на сервере rails по умолчанию, поэтому проблема с Thin упоминается вколлективные вопросы часто не применяются. Спасибо

Ответы [ 3 ]

7 голосов
/ 06 января 2012

Использование Mailer.delay.send_method кажется некорректным в Rails 3 (они упоминают, что это хак в документации). У меня был тот же NoMethodError, и я решил его, используя альтернативный метод для создания заданий, показанных в документах, т.е. создание нового класса Job с помощью метода execute, например,

class UserMailerJob < Struct.new(:text, :email)
  def perform
    UserMailer.your_mailer_method(text, email).deliver
  end
end

Затем, чтобы создать работу, в моем контроллере:

Delayed::Job.enqueue UserMailerJob.new(@text, @email)

Это немного дольше, чем использование задержки, но, похоже, правильно создаются задания и надежно обрабатываются.

4 голосов
/ 25 декабря 2011

Я исправил эту проблему, переключившись на delayed_job (DJ) версии 2.1.2.

Я использую: РВМ ruby 1.8.7 (уровень обновления 24-01 2010-10) рельсы 3.0.9

Gemfile: gem "delayed_job", '2.1.2'

До этого я пытался использовать последнюю версию delayed_job: gem "delayed_job",: git => 'git: //github.com/collectiveidea/delayed_job.git' для меня это был v3.0.0.pre

Но: рельсы генерируют delayed_job не генерирует файл миграции. Я создал это вручную. Затем после 'rake db: migrate' у меня есть таблица для хранения очереди delayed_job. А потом, когда я подумал, что все должно работать правильно, я получил ту же ошибку.

Когда я пытался найти источник этой ошибки, в таблице 'delayed_jobs' я обнаружил, что задачи delayed_job неправильно сохранены. Вот фрагмент из поля 'handler' в таблице 'delayed_jobs':

--- !ruby/object:Delayed::PerformableMailer 
object: !ruby/class Notifier

Как я знаю, delayed_job получает все задачи через класс Struct, поэтому задача должна быть сохранена с заголовком '! Ruby / struct' вместо '! Ruby / object' Вот фрагмент правильно сохраненного задания:

--- !ruby/struct:Delayed::PerformableMailer 
object: !ruby/class Notifier

Чтобы проверить это, я остановил процесс delaed_job в консоли. Затем я вызвал какой-то метод для помещения задачи диджея в БД:

Notifier.delay.some_email(current_user, @event_message)

Затем я вручную заменил «! Ruby / object» на «! Ruby / struct» в поле «handler». Затем я начал работать с ди-джеем «Rake Job: Work», и мне сказали, что почта успешно отправлена.

Но: - это задание не было удалено из таблицы диджея - и почта не доходит до получателя

Итак, я решил, что это ошибка в новой версии delayed_job. Я переключился на ди-джея «2.1.2», и он отлично сработал.

P.S .: Извините за мой английский:)

0 голосов
/ 09 января 2012

Просто короткая заметка. У меня была эта проблема, и это было, потому что я передавал переменную из модели в метод доставки BEFORE_SAVE. Переход на AFTER_CREATE устранил проблему для меня.

...