2013-01-21 12 views
5

Mam to zadanie z delayed_job:opóźnionego zadania z i18n na szynach 3

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

Jeśli mogę wysłać e-mail jako tryb szyn:

def any_method 
locale = params[:locale] 
UserMailer.to_user_when_his_account_is_suspended(order, locale).deliver 
#more code 
end 

Wiadomość e-mail zostanie wysłana na prawidłowe locale/język .

Jednak delayed_job nie rozpoznaje właściwego ustawienia/języka. W tej sprawie mogę uzyskać locale z locale = params[:locale] można zobaczyć kolejny przykład:

locale = params[:locale] 
UserMailer.delay(queue: "Email", priority: 3).to_user_when_his_account_is_suspended(user, locale) 

Code 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 

Jak mogę rozwiązać ten problem?

+0

Co masz na myśli mówiąc „delayed_job nie rozpoznaje właściwą lokalizację”? Czy chcesz dodać "dostawę"? –

+0

Jeśli dodasz metodę '.deliver' do metody delayed_job, zauważysz błąd. Mam na myśli to, że wysłane e-maile nie są wysyłane na jego własny język. Język jest odbierany w mojej metodzie z parametrami [: locale]. Dziękuję Ci! – hyperrjas

+0

parametry [: locale]? To nie brzmi dobrze. Czy masz na myśli to, że odwołujesz się do lokalnych ustawień zmiennych w zadaniu, ponieważ tylko w ten sposób zadziała. –

Odpowiedz

1

Dobra, po pierwsze, myślę, że twój "istniejący" kod pocztowy działa, kiedy nie jest w DJ.

Twoje ustawienia regionalne są ustawiane za pomocą I18n.locale. Jest to ustawione na poziomie specyficznym dla wątku ... stąd zakładając, że ustawiasz I18n.locale gdzieś dla użytkownika, to Railsy używają tego do wysyłania.

Jednak DJ użyje oddzielnego procesu całkowicie ... więc nie może dziedziczyć ustawień regionalnych! Oznacza to, że powróci do domyślnych ustawień narodowych.

Jak bym zmienić swoją przesyłkę:

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 

To będzie tymczasowo zmienić język wątku w program pocztowy, a następnie, jak dobry obywatel, to ustawić ją z powrotem do starej wartości co koniec żądania.

Oczywiście, jeśli robisz to w każdym miejscu, chcesz wyodrębnić go do metody pomocniczej, która daje kontrolę.

+0

Dziękuję Joe, popraw odpowiedź. Teraz działa poprawnie: D. Dziękuję Ci! – hyperrjas

3

To jest lepsze podejście, nadzieję, że pomoże ktoś:

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