4

AnswerObserver < ActiveRecord::ObserverRails アプリに次のコードがあります。回答が作成されると、質問を見ているユーザーにメールが送信されます。

  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.

したがって、アクションメーラーメソッド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)

ここのファイルの例を参照してください

于 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 に答える