5

我有这个任务延迟_job:

def any_method
 UserMailer.delay(queue: "Email", priority: 3).to_user_when_his_account_is_suspended(user, locale)
end

如果我以 Rails 模式发送电子邮件:

def any_method
 locale = params[:locale]
 UserMailer.to_user_when_his_account_is_suspended(order, locale).deliver
 #more code
end

电子邮件以正确的语言环境/语言发送。

但是, delayed_job无法识别正确的语言环境/语言。在这种情况下,我使用 获取语言环境locale = params[:locale],您可以看到下一个示例:

locale = params[:locale]
UserMailer.delay(queue: "Email", priority: 3).to_user_when_his_account_is_suspended(user, locale)

邮件代码:

 def to_user_when_his_account_is_suspended(user, locale)
  @user = user
  @locale = locale
  mail(:to => @user.email, :subject => t('.user_account_has_been_suspended'))
 end

我该如何解决这个问题?

4

2 回答 2

5

这是一个更好的方法,希望它可以帮助某人:

 def to_user_when_his_account_is_suspended(user, locale)
   @user = user
   I18n.with_locale(locale) do
     mail(:to => @user.email, :subject => t('.user_account_has_been_suspended'))
   end
 end
于 2015-08-03T21:25:29.837 回答
1

好的,首先,为什么我认为您的“现有”邮件程序代码不在 DJ 中时可以正常工作。

您的语言环境是通过 I18n.locale 设置的。这是在特定于线程的级别上设置的......因此,假设您在某处为用户设置 I18n.locale,那么 Rails 正在使用它来发送。

然而,DJ 将完全使用一个单独的进程......所以它不能继承语言环境!这意味着它将回退到您的默认语言环境。

我将如何更改您的邮件:

def to_user_when_his_account_is_suspended(user, locale)
  @user = user
  old_locale = I18n.locale
  I18n.locale = locale
  mail(:to => @user.email, :subject => t('.user_account_has_been_suspended'))
  I18n.locale = old_locale
end

这将临时更改邮件程序中线程的语言,然后像一个好公民一样,在请求结束时将其设置回旧值。

显然,如果您在所有地方都这样做,您希望将其提取到产生控制的辅助方法中。

于 2013-01-21T18:46:00.837 回答