使用此railscast http://railscasts.com/episodes/127-rake-in-background?autoplay=true作为示例/灵感(即我不是试图实现rails演员代码,只是将其用作灵感),我试图移动邮件,这是由一个after_create user.rb模型中的回调,转换为rake任务,因此它将在后台运行。邮件程序在我将其转移到rake任务之前正在工作,但它不再起作用了。
而不是从User.rb模型调用邮件程序,它最初是如何设置的(参见user.rb中注释掉的代码),而是调用rake任务,然后调用UserMailer.welcome_email方法
在原始代码中,“self”已从(User.rb)提交为user_mailer.rb中方法welcome_email(user)
的参数。在我尝试将其转换为rake任务时,我将“self”分配给USER_INSTANCE,它应该在mailer.rake中作为ENV [“USER_INSTANCE”]被选中。这也是railscast的建议。
一路上它不起作用。有什么想法吗?
User.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
端
答案 0 :(得分:1)
目前你正在这样做
system "rake :send_mailing USER_INSTANCE=self &"
与转到命令行并输入
相同 rake :send_mailing USER_INSTANCE=self &
self只是一个文字字符串,我认为你要做的就是这个
system "rake :send_mailing USER_INSTANCE=#{self} &"
但这最终将等同于在命令行上运行它
rake :send_mailing USER_INSTANCE=<User::xxxxx>
rake不会将其序列化为您的User ActiveRecord对象; 当您使用系统进行shell时,与调用代码
无关替代方案 - 您的rake任务可以采用整数 - user_id,然后通过User.find访问记录 但是由于after_create将在一个事务中运行,所以它会变得更加复杂,所以一旦你的rake任务运行,它可能会或者可能没有完成那个事务
我建议不要试图重新发明一种在rails中进行后台处理的方法,已经有很好的尝试和真正的解决方案
请参阅http://railscasts.com/?tag_id=32了解一些选项