在rails 3上使用i18n的延迟作业



我有这个任务delayed_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

如何解决这个问题?

这是一个更好的方法,希望能帮助到一些人:

 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

好吧,首先,为什么我认为你的'现有'邮件代码工作时,它不是在DJ。

区域设置是通过I18n.locale设置的。这是在线程特定级别上设置的…因此,假设您正在设置I18n。区域设置,然后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

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

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

相关内容

  • 没有找到相关文章

最新更新