hyp*_*jas 5 ruby ruby-on-rails delayed-job ruby-on-rails-3
我有使用delayed_job的这个任务:
def any_method
UserMailer.delay(queue: "Email", priority: 3).to_user_when_his_account_is_suspended(user, locale)
end
Run Code Online (Sandbox Code Playgroud)
如果我以rails模式发送电子邮件:
def any_method
locale = params[:locale]
UserMailer.to_user_when_his_account_is_suspended(order, locale).deliver
#more code
end
Run Code Online (Sandbox Code Playgroud)
电子邮件以适当的语言环境/语言发送.
但是delayed_job无法识别正确的区域设置/语言.在这种情况下,我得到了语言环境locale = params[:locale],你可以看到下一个例子:
locale = params[:locale]
UserMailer.delay(queue: "Email", priority: 3).to_user_when_his_account_is_suspended(user, locale)
Run Code Online (Sandbox Code Playgroud)
邮寄编码:
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
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
小智 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
Run Code Online (Sandbox Code Playgroud)
好的,首先,为什么我认为您的“现有”邮件程序代码不在 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
Run Code Online (Sandbox Code Playgroud)
这将暂时更改邮件程序中线程的语言,然后,像一个好公民一样,它会在请求结束时将其设置回旧值。
显然,如果您在各处都这样做,您希望将其提取到一个可以产生控制的辅助方法中。
| 归档时间: |
|
| 查看次数: |
990 次 |
| 最近记录: |