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

Ruby on rails Rails:使用参数/env变量从rake任务调用邮件程序,ruby-on-rails,rake,Ruby On Rails,Rake,使用这个railscast作为示例/灵感(即,我不想实现rails cast代码,只是将其作为灵感使用),我尝试将一个邮件程序(由user.rb模型中的after_create回调触发)移动到一个rake任务中,以便在后台运行。在我将邮件程序转移到rake任务之前,它已经工作了,但现在已经不工作了 我没有从User.rb模型调用mailer,而是调用rake任务,然后调用UserMailer.welcome\u email方法,这是它最初的设置方式(参见User.rb中注释掉的代码) 在原始代码

使用这个railscast作为示例/灵感(即,我不想实现rails cast代码,只是将其作为灵感使用),我尝试将一个邮件程序(由user.rb模型中的after_create回调触发)移动到一个rake任务中,以便在后台运行。在我将邮件程序转移到rake任务之前,它已经工作了,但现在已经不工作了

我没有从User.rb模型调用mailer,而是调用rake任务,然后调用UserMailer.welcome\u email方法,这是它最初的设置方式(参见User.rb中注释掉的代码)

在原始代码中,“self”(从User.rb)作为参数提交给User\u mailer.rb中的方法
welcome\u email(User)
。在我尝试将其转换为rake任务时,我将“self”分配给USER\u实例,该实例应该作为ENV[“USER\u INSTANCE”]在mailer.rake中提取。这也是铁路公司的建议

一路上的某个地方它不起作用。有什么想法吗

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
未更改的用户\u mailer.rb

 class UserMailer < ActionMailer::Base
  default :from => "blahblah@gmail.com"

  def welcome_email(user)
    mail(:to => user.email, :subject => "Invitation Request Received")
  end
class UserMailer”blahblah@gmail.com"
def欢迎电子邮件(用户)
邮件(:to=>user.email,:subject=>“收到邀请请求”)
结束

结束

当前您正在执行此操作

system“rake:send\u mailing USER\u INSTANCE=self&”

这与转到命令行并键入相同

rake:send\u mailing USER\u INSTANCE=self&

self只是一个文本字符串,我想你要做的是

system“rake:send_mailing USER_INSTANCE=#{self}&”

但这最终将等同于在命令行上运行此命令

rake:send\u mailing USER\u INSTANCE=

rake不会将其序列化到用户ActiveRecord对象中; 当您使用系统进行shell时,与调用代码没有任何关系

另一种方法是,您的rake任务可以获取一个整数user_id,然后通过user.find访问记录 但它变得更加复杂,因为after_create将在事务中运行,所以一旦您的rake任务运行,它可能已经完成该事务,也可能尚未完成该事务

我建议不要试图重新发明一种在rails中进行后台处理的方法,因为已经有了经过实践检验的好解决方案


有关一些选项,请参见

不要这样做-使用延迟的作业或其他后台处理我仍然想知道如何使其工作。我知道delayed_job已经过时了,我认为“self”应该是一个实例,就像在我注释掉的原始代码中将它作为参数传递给welcome_email方法时一样。顺便说一句,我现在正在尝试delayed_job,但无法使它工作。如果你还有耐心:))这里是链接。谢谢你的帮助
 class UserMailer < ActionMailer::Base
  default :from => "blahblah@gmail.com"

  def welcome_email(user)
    mail(:to => user.email, :subject => "Invitation Request Received")
  end