4

AnswerObserver < ActiveRecord::Observer我的Rails 应用程序中有以下代码。创建答案后,会向查看问题的用户发送一封电子邮件。

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

Notifier 继承自 ActionMailerclass 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

根据这篇博文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.

因此,我在调用 action mailer 方法 answer_updated 的观察者中将“deliver”方法替换为“delay”,如下所示

  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。你能解释一下我可能做错了什么吗?

4

2 回答 2

7

正确的方法是:

Notifier.delay.answer_updated(answer, user)

请参阅文件中的示例Here

于 2013-04-21T22:52:42.347 回答
3

它对我没有用。没有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
于 2015-07-27T15:29:36.557 回答