2013-04-21 5 views
2

У меня есть следующий код в AnswerObserver < ActiveRecord::Observer в моем приложении Rails. После того, как будет создан ответ, отправляется электронное письмо пользователям, просматривающим вопрос.Задержка отправки электронной почты

def after_create(answer) 
    answer.question.watchers.each do |user| 
    Notifier.answer_updated(answer, user).deliver 
    end 

Notifier наследует от ActionMailer class Notifier < ActionMailer::Base и имеет метод

def answer_updated(answer, user) 
    @answer = answer 
    @user = user 
    mail(:to => user.email, 
     :subject => "Your question has been answered") 
    end 

Я сейчас пытаюсь использовать SideKiq, чтобы переместить его в фоновый процесс. У меня установлен и запущен redis, и я начал sidekiq успешно с bundle exec sidekiq.

Согласно этому BlogPost http://blog.remarkablelabs.com/2013/01/using-sidekiq-to-send-emails-asynchronously, SideKiq имеет встроенную поддержку для ActionMailer

The method that you will likely use the most is .delay. Calling .delay from an Action Mailer will result in the email being added to the DelayedMailer queue for processing. 

Поэтому я заменил «доставить» метод с «задержкой» в наблюдателе, который вызывает метод действия почтовой программы answer_updated, как этот

def after_create(answer) 
    answer.question.watchers.each do |user| 
    Notifier.answer_updated(answer, user).delay 
    end 

Но теперь я получаю эту ошибку

undefined method `delay' for #<Mail::Message:0x007fee0c9af1d0> 

Я еще не сделал ничего, чтобы настроить SideKiq. Можете ли вы объяснить, что я могу делать неправильно?

ответ

6

Правильный способ сделать это:

Notifier.delay.answer_updated(answer, user) 

Смотрите примеры в файле Here

+0

или Томоко может ответить так же, действительно глупый вопрос, но мне нужно, чтобы сделать все другие такие как добавление рабочего и т. д., если все, что я хочу сделать, это использовать Sidekiq для электронных писем? Благодарю. – noob

0

Это не работает для меня. Нет метода delay для mailer. Посмотрите здесь:

>> RUBY_VERSION 
=> "2.2.0" 
>> Rails::VERSION::STRING 
=> "4.2.1" 

>> mailer.methods.include?(:delay) 
=> false 
>> mailer.send_email(mailable, recipient).methods.include?(:deliver_later) 
=> true 

Таким образом, если вы используете Rails> 4.2 использовать это:

Notifier.answer_updated(answer, user).deliver_later