2013-01-21 2 views
5

У меня есть эта задача с delayed_job:отложенной работы с i18n по рельсам 3

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) 

Mailer Код:

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 

Как я могу исправить эту проблему?

+0

Что вы имеете в виду «delayed_job не признает правильное место»? Вы хотите добавить «доставить»? –

+0

Если вы добавите метод '.deliver' в метод delayed_job, вы поймаете ошибку. Я имею в виду, что отправленные электронные письма не отправляются на его правильный язык. Язык, полученный по моему методу с параметрами [: locale]. Спасибо! – hyperrjas

+0

params [: locale]? Это звучит не так. Вы имеете в виду, что вы ссылаетесь на локальную переменную locale внутри задачи, потому что это единственный способ ее работы. –

ответ

1

Хорошо, во-первых, почему я думаю, что ваш «существующий» почтовый код работает, когда он не в ди-джее.

Ваш язык установлен через 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 

Это временно изменить язык для потока в почтовой программе, а затем, как хороший гражданин, он будет установить его обратно к старому значению в конец запроса.

Очевидно, что если вы делаете это по всему месту, вы хотите извлечь его в вспомогательный метод, который дает управление.

+0

Спасибо, Джо, верен ваш ответ. Теперь работает нормально: D. Спасибо! – hyperrjas

3

Это лучший подход, надеюсь, это поможет кто-нибудь:

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 
Смежные вопросы