Rails 3 - Delayed_Job - PullRequest
       1

Rails 3 - Delayed_Job

4 голосов
/ 11 декабря 2010

Я работаю, чтобы научиться использовать delayed_job в моем приложении rails 3 + heroku.

В настоящее время у меня есть следующие сообщения по запросу (не отложенная работа), но это работает!

UserMailer.conversation_notification(record.commentable, participant, record, @comments).deliver

Я обновил это, чтобы начать использовать delayed_job:

Delayed::Job.enqueue UserMailer.conversation_notification(record.commentable, participant, record, @comments).deliver

Но эта ошибка возникла с: "ArgumentError (не может поставить в очередь элементы, которые не отвечают на выполнение):"

Я тоже пробовал:

UserMailer.delay.conversation_notification(record.commentable, participant, record, @comments)

Но эта ошибка произошла с:

NoMethodError (undefined method `delay' for UserMailer:Class):

Есть какой-нибудь гуру delayed_job? Спасибо

Ответы [ 3 ]

6 голосов
/ 08 марта 2011

Из документов https://github.com/collectiveidea/delayed_job

Ваш второй метод был верным, который удаляет метод .deliver:

UserMailer.delay.conversation_notification(record.commentable, participant, record, @comments)

Если вы получаете неопределенный метод delay Вы добавили DelayedJob в Gemfile?

gem "delayed_job"

Поскольку включение delayed_job добавит метод «delay» ко всему.

2 голосов
/ 23 июля 2011

Я смешал результаты с использованием задержки, и мне было очень сложно отлаживать.Так что вы не одиноки!Но когда вы заставите его работать, оно того стоит.

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

В качестве эксперимента какое-то время я использовал другую схему.Я бы создал объект задания для каждой работы, которая у меня есть.Например, я бы назвал

Delayed::Job.enqueue(PersonJob.new(@person.id))

В другом месте моего проекта я бы создал объект задания.В Rails 2 я помещаю их в lib /, если вы делаете это с помощью rails 3, вам нужно изменить application.rb config.autload_path

class PersonJob < Struct.new(:person_id)
  def perform
    person = Person.find(person_id)
    #do work
  end
end


config.autoload_paths += Dir["#{config.root}/lib/**/"]
1 голос
/ 11 декабря 2010

Я только что посмотрел на документацию, это было давно, так как я на самом деле использовал delayed_job ...

Задания - это объекты Ruby с методом perform, поэтому вам нужно поставить в очередь объект, который выполняет

UserMailer.conversation_notification(record.commentable, participant, record, @comments).deliver

в его perform методе.

В качестве альтернативы вы можете использовать send_later:

UserMailer.conversation_notification(record.commentable, participant, record, @comments).send_later(:deliver)
...