2013-01-21 11 views
5

ho questo compito con delayed_job:differita lavoro con i18n su rotaie 3

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

Se invio un e-mail in modalità come rotaie:

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

L'email viene inviata sul corretto locale/lingua .

Tuttavia delayed_job non riconosce la lingua/lingua corretta. Su questo caso ho localizzazione con locale = params[:locale], è possibile vedere l'esempio seguente:

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

Codice 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 

Come posso risolvere questo problema?

+0

Cosa vuol dire 'delayed_job non riconosce la posizione corretta'? Vuoi aggiungere "consegna"? –

+0

Se si aggiunge il metodo '.deliver' al metodo delayed_job, si verificherà un errore. Intendo dire che le e-mail inviate non vengono inviate nella sua lingua corretta. La lingua, è ricevuta sul mio metodo con params [: locale]. Grazie! – hyperrjas

+0

parametri [: locale]? Non sembra giusto. Intendi dire che fai riferimento alla locale delle variabili locali all'interno dell'attività, perché è l'unico modo in cui funzionerebbe. –

risposta

1

Ok, prima, perché penso che il tuo codice postale "esistente" funzioni quando non è in DJ.

Le impostazioni locali sono impostate tramite I18n.locale. Questo è impostato su un livello specifico del thread ... quindi, assumendo che tu stia impostando I18n.locale da qualche parte per l'utente, allora Rails lo sta usando per inviare.

Tuttavia, DJ utilizzerà completamente un processo separato ... quindi non può ereditare le impostazioni locali! Ciò significa che tornerà a qualsiasi impostazione locale predefinita.

Come vorrei cambiare il vostro programma di posta:

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 

Questo cambierà temporaneamente la lingua per il thread nel mailer, e poi, come un buon cittadino, che verrà impostato di nuovo al vecchio valore a la fine della richiesta.

Ovviamente, se lo stai facendo dappertutto, vuoi estrarlo in un metodo di supporto che fornisce il controllo.

+0

Grazie Joe è corretta la tua risposta. Ora sta funzionando bene: D. Grazie! – hyperrjas

3

Questo è un approccio migliore, spero che aiuta qualcuno:

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