【发布时间】:2012-05-12 19:14:30
【问题描述】:
使用这个 railscast http://railscasts.com/episodes/127-rake-in-background?autoplay=true 作为示例/灵感(即我没有尝试实现 rails cast 代码,只是将其用作灵感),我尝试移动一个由 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 也提出了这一点。
在某些地方它不起作用。有什么想法吗?
用户.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
结束
【问题讨论】:
-
不要这样做 - 使用延迟作业或其他后台进程
-
我仍然想弄清楚如何让它工作。我已经知道delayed_job
标签: ruby-on-rails rake