2013-01-21 10 views
5

Ich habe diese Aufgabe mit delayed_job:Delayed Job mit i18n auf Schienen 3

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

Wenn ich eine E-Mail als Schienen-Modus senden:

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

Die E-Mail wird auf der richtigen locale/Sprache gesendet .

Jedoch delayed_job erkennt nicht die richtige Ländereinstellung/Sprache. Auf diesem Fall habe ich mit locale = params[:locale] locale erhalten, können Sie das nächste Beispiel sehen:

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

Mailer-Code:

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 

Wie kann ich dieses Problem beheben?

+0

Was meinst du mit ‚delayed_job nicht die richtige Lage erkennt‘? Möchten Sie "liefern" hinzufügen? –

+0

Wenn Sie der delayed_job-Methode die '.deliver'-Methode hinzufügen, erhalten Sie eine Fehlermeldung. Ich meine, dass die versendeten E-Mails nicht in seiner richtigen Sprache gesendet werden. Die Sprache wird auf meiner Methode mit params [: locale] empfangen. Vielen Dank! – hyperrjas

+0

params [: Gebietsschema]? Das klingt nicht richtig. Meinst du, dass du das lokale Variablengebietsschema in der Aufgabe referenzierst, weil das die einzige Möglichkeit ist, das es funktionieren würde. –

Antwort

1

Okay, zuerst, warum ich denke, dass Ihre "bestehenden" Mailer-Code funktioniert, wenn es nicht in DJ ist.

Ihr Gebietsschema wird über I18n.locale festgelegt. Dies wird auf einer threadspezifischen Ebene festgelegt. Wenn Sie also I18n.locale irgendwo für den Benutzer festlegen, verwendet Rails das zum Senden.

DJ verwendet jedoch einen separaten Prozess vollständig ... so kann er das Gebietsschema nicht erben! Dies bedeutet, dass es auf das ursprüngliche Gebietsschema zurückgreift.

Wie würde ich Ihr Mailer ändern:

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 

Dies wird vorübergehend die Sprache für den Thread in dem Mailer ändern, und dann, wie ein guten Bürger, wird es wieder auf den alten Wert an das Ende der Anfrage.

Offensichtlich, wenn Sie dies überall tun, möchten Sie es in eine Hilfsmethode extrahieren, die Kontrolle gibt.

+0

Danke Joe ist deine Antwort korrekt. Jetzt funktioniert es gut: D. Vielen Dank! – hyperrjas

3

Dies ist ein besserer Ansatz, hoffen, dass es jemand hilft:

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