在轨道上使用i18n延迟工作3

时间:2013-01-21 12:27:01

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

我的任务是delayed_job:

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

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

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

如何解决此问题?

2 个答案:

答案 0 :(得分:4)

这是一种更好的方法,希望它有助于某人:

 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

答案 1 :(得分: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

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

显然,如果你在整个地方这样做,你想把它提取到一个产生控制的辅助方法。