5

私は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

この問題を解決するにはどうすればよいですか?

4

2 に答える 2

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 に答える