Rails:使用参数/ env变量从rake任务调用邮件程序

时间:2012-05-12 19:14:31

标签: ruby-on-rails rake

使用此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

1 个答案:

答案 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了解一些选项