Delayed_job ActionMailer缓存?

时间:2013-03-04 16:27:20

标签: ruby-on-rails-3 actionmailer delayed-job

我目前拨打delayed_job(gem delayed_job_mongoid)发送确认电子邮件。但是,它似乎没有使用我传递的最新数据,而是使用缓存版本。见下文:

我的控制器:

...
_user.calculate_orders
_user.save
_user.reload
Mailer.delay.order_reported(_user)
...

The Mailer

class Mailer < Devise::Mailer
  def order_reported(to_user)
    @to_user = to_user
    email_with_name = "#{@to_user.name} <#{@to_user.email}>"
    mail(:to => email_with_name, :subject => "Test email")
  end
end

例如,如果属性_user.total_orders = 3更新为5并保存。它正确地反映在数据库中,延迟的作业DB记录包含更新的信息5,但是当发送电子邮件时,它使用3的缓存信息。

我也试过通过rails console调用该方法:

这适用于并使用已传递和更新信息的参数

Mailer.order_reported(u).deliver

这不起作用并使用缓存数据

Mailer.delay.order_reported(u)

1 个答案:

答案 0 :(得分:0)

最近我遇到了与Sidekiq非常相似的问题,与传递User对象的序列化版本而不仅仅是ID有关。

我会稍微重构一下,只将简单对象作为参数传递给延迟方法。所以,你可以这样做:

Mailer.delay.order_reported(_user.id)

然后将方法更新如下:

class Mailer < Devise::Mailer
  def order_reported(to_user_id)
    @to_user = User.find(to_user_id)
    email_with_name = "#{@to_user.name} <#{@to_user.email}>"
    mail(:to => email_with_name, :subject => "Test email")
  end
end

这将确保您在邮件实际发送时始终获得一个新的用户对象。