NoMethodError с delayed_job (collectidea gem)

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

ОБНОВЛЕНИЕ 2: Для тех, кто работает в этой проблеме на Heroku специально, я нашел понижение до Rake 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'

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

EventMailer.delay.event_message_email(current_user, @event_message)

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

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

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

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

Ответ 1

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

Я использую: РВМ ruby 1.8.7 (2010-01-10 patchlevel 249) рельсы 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 были неправильно сохранены. Вот фрагмент из полевого "обработчика" в таблице "delayed_jobs":

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

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

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

Чтобы проверить это, я остановил процесс delaed_job в консоли. Затем я вызвал некоторый метод, чтобы поставить задачу DJ в DB:

Notifier.delay.some_email(current_user, @event_message)

Затем я вручную заменил "! ruby ​​/object" на "! ruby ​​/struct" в поле "обработчик". Затем я начал работу "rake jobs": "Работа", он сказал мне, что почта была успешно отправлена.

Но: - эта задача не удалялась из таблицы DJ - и почта не попадает к получателю

Итак, я решил, что это ошибка в новой версии delayed_job. Я переключился на DJ '2.1.2', и это сработало для меня хорошо.

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

Ответ 2

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

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

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

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

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

Ответ 3

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