0

我正在用 Ruby on Rails 开发一个邮件 Web 应用程序,我遇到了延迟工作 gem 的问题:

在我的应用程序设置中,我允许客户更新发送邮件的电子邮件地址。但我发现有类似来自delayed_job 的缓存的东西,它不使用更新电子邮件地址作为« from » 标头。

当我手动使用 Capistrano 的delayed_job 任务时,它可以工作,所以我尝试在我的模型中添加一个回调 after_update 来处理delayed_job 的重新启动,但没有任何成功。

Capistrano 命令:

cap <my_env> delayed_job:restart # this works but it’s a manual command so useless in my case

我尝试的是从模型中动态重启delayed_job:

class Setting < ActiveRecord::Base
  after_save :restart_delayed_job

  def restart_delayed_job
    if email_changed?
      system "RAILS_ENV=#{Rails.env} do bundle exec bin/delayed_job -n 1 restart"
    end
  end
end

我的邮件类:

class MyMailer < ApplicationMailer
  default from: Setting.first.email # After updating the email value in setting, it still the old one used.
  # more code skipped
end

有谁知道我怎样才能从 Rails 重新启动 delay_job ?
有没有办法只在 Ruby 中完成它而无需编写 shell 脚本?
为了帮助我更好地理解,是否有多个延迟作业实例(服务器中的网站一个)或所有网站一个?

谢谢你的帮助 !

我的项目
- Rails 4.2.5
- Ruby 2.2.2
- ActiveAdmin 1.0.0 pre2
- 延迟工作 4.1.1
- Capistrano 3.4.0

4

1 回答 1

0

解决方案是将from标题移动到mail函数中。原因是默认 from 仅在应用程序启动时设置一次,并且不能以这种方式更改。

mail(from: email, subject: subject, ...) do
  # skipped code
end

这是帮助我理解的答案:https ://github.com/collectiveidea/delayed_job/issues/882

于 2016-02-16T19:34:45.227 回答