【问题标题】:Rails: invoking a mailer from a rake task with parameter/env variableRails:使用参数/环境变量从 rake 任务调用邮件程序
【发布时间】: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


【解决方案1】:

目前你正在这样做

system "rake :send_mailing USER_INSTANCE=self &amp;"

这和去命令行输入是一样的

rake :send_mailing USER_INSTANCE=self &amp;

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

system "rake :send_mailing USER_INSTANCE=#{self} &amp;"

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

rake :send_mailing USER_INSTANCE=&lt;User::xxxxx&gt;

rake 不会将其序列化到您的 User ActiveRecord 对象中; 当您与系统脱壳时,与调用代码无关

另一种选择 - 您的 rake 任务可以采用整数 - user_id 然后通过 User.find 访问记录 但它变得更加复杂,因为 after_create 将在事务中运行,所以一旦你的 rake 任务运行,它可能已经完成,也可能没有完成该事务

我建议不要尝试重新发明一种在 Rails 中进行后台处理的方法,已经有很好的尝试和真正的解决方案可用

查看http://railscasts.com/?tag_id=32 了解一些选项

【讨论】:

  • 谢谢,我认为“self”将是一个实例,就像它作为参数传递给我注释掉的原始代码中的welcome_email 方法一样。
  • 顺便说一句,我现在正在尝试delayed_job,但无法让它工作。如果你有更多的耐心:))) 这是链接。感谢您的帮助stackoverflow.com/questions/10567657/…
猜你喜欢
  • 1970-01-01
  • 2014-02-27
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 2019-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多