この Railscast http://railscasts.com/episodes/127-rake-in-background?autoplay=trueを例/インスピレーションとして使用します (つまり、レールキャストコードを実装しようとしているのではなく、インスピレーションとして使用してください) 、user.rbモデルのafter_createコールバックによってトリガーされたメーラーをrakeタスクに移動しようとしたため、バックグラウンドで実行されました。rake タスクに移動する前は、メーラーは機能していましたが、機能しなくなりました。
User.rb モデルからメーラーを呼び出すのではなく (user.rb のコメントアウトされたコードを参照)、代わりに rake タスクを呼び出します。これにより、UserMailer.welcome_email メソッドが呼び出されます。
元のコードでは、「self」が (User.rb から) パラメータとしてwelcome_email(user)
user_mailer.rb のメソッドに送信されました。これを rake タスクに変えようとして、「self」を USER_INSTANCE に割り当てました。これは、mailer.rake で ENV["USER_INSTANCE"] として取得されるはずです。これは、Railscast によっても提案されました。
途中でうまくいかないところがあります。何か案は?
ユーザー.rb
after_create :send_welcome_email
def send_welcome_email
system "rake :send_mailing USER_INSTANCE=self &" #note the & forks the task
#UserMailer.welcome_email(self).deliver <-- how it was originally.
end
mailer.rake
desc "Send mailing"
task :send_mailing => :environment do
UserMailer.welcome_email(ENV["USER_INSTANCE"]).deliver #moved from user.rb to here but now with environment variable instead of parameter
end
変更されていない User_mailer.rb
class UserMailer < ActionMailer::Base
default :from => "blahblah@gmail.com"
def welcome_email(user)
mail(:to => user.email, :subject => "Invitation Request Received")
end
終わり