10

アプリへのサインアップ時にユーザーに送信される通知メールを遅らせようとしています。電子メールは、ActionMailer私が呼び出すを使用して送信されますInitMailer。私がジョブを遅らせようとしている方法は、collectiveidea のdelayed_job https://github.com/collectiveidea/delayed_jobを使用することです。handle_asynchronouslyこれを行うには、メソッドを定義した後に指定することがわかりますinitial_email

class InitMailer < ActionMailer::Base
  default :from => "info@blahblahblah.com"

  def initial_email(user)
    @user = user
    @url = "http://www.blahblahblah.com"
    mail(:to => user.email,
         :subject => "Welcome to my website!"
         ) 
  end

  handle_asynchronously :initial_email
end

ただし、ログ ファイルに次の引数エラーが表示されます"delayed_job.log"

Class#initial_email failed with ArgumentError: wrong number of arguments (1 for 0) - 5 
failed attempts

参考までに、電子メールは次の行を使用してコントローラーで送信されます。

@user = InitUser.new(params[:init_user])
InitMailer.delay.initial_email(@user)

さらに、遅滞なくコードをセットアップすると、電子メールは問題なく送信されました (gmail サーバーを待っているアプリの速度が低下したという事実を除いて)。

ここでエラーの原因はどこにありますか? 遅延メールを正しく送信するにはどうすればよいですか?

4

1 に答える 1

10

Rails3 がメーラーを実装する方法により、delayed_jobs にはいくつかの通常とは異なる回避策があります。たとえば、メーリングを遅らせるには、次のように記述します。

 ExampleMailer.delay.example(user)

通常handle_asynchronouslyはメソッド定義の後に記述する必要がありますが、メーラーの場合、この宣言により (何らかの理由で) 遅延したジョブが機能しなくなります。

したがって、このコードでは、宣言を完全に削除します。

 class InitMailer < ActionMailer::Base
   default :from => "info@blahblahblah.com"

   def initial_email(user)
     @user = user
     @url = "http://www.blahblahblah.com"
     mail(:to => user.email,
          :subject => "Welcome to my website!"
          ) 
   end

   #No handle_asynchronously needed here
 end
于 2011-07-05T18:39:46.737 に答える