2013-01-21 27 views
5

Tôi có nhiệm vụ này với delayed_job:Job hoãn với i18n trên đường ray 3

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

Nếu tôi gửi một email như đường ray mode:

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

Các email được gửi trên ngôn ngữ/ngôn ngữ thích hợp .

Tuy nhiên delay_job không nhận ra ngôn ngữ/ngôn ngữ thích hợp. Vào trường hợp này tôi có được Locale với locale = params[:locale], bạn có thể xem ví dụ sau:

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 

Làm thế nào tôi có thể khắc phục vấn đề này?

+0

Ý anh là gì 'delayed_job không nhận ra vị trí thích hợp'? Bạn có muốn thêm 'phân phối' không? –

+0

Nếu bạn thêm phương thức '.deliver' vào phương thức delay_job, bạn sẽ gặp lỗi. Tôi có nghĩa là các email đã gửi, không được gửi bằng ngôn ngữ thích hợp của anh ấy. Ngôn ngữ, được nhận trên phương thức của tôi với các tham số [: locale]. Cảm ơn bạn! – hyperrjas

+0

params [: locale]? Điều đó nghe không đúng. Bạn có nghĩa là bạn tham khảo miền địa phương biến địa phương bên trong nhiệm vụ, bởi vì đó là cách duy nhất nó sẽ làm việc. –

Trả lời

1

Được rồi, trước tiên, tại sao tôi nghĩ mã người gửi 'hiện tại' của bạn đang hoạt động khi không có trong DJ.

Miền địa phương của bạn được đặt qua I18n.locale. Điều này được thiết lập trên một cấp độ cụ thể thread ... do đó, giả sử bạn đang thiết lập I18n.locale một nơi nào đó cho người dùng, sau đó Rails đang sử dụng để gửi.

Tuy nhiên, DJ sẽ sử dụng một quy trình riêng hoàn toàn ... vì vậy, nó không thể kế thừa ngôn ngữ! Điều này có nghĩa là nó sẽ quay trở lại bất kỳ ngôn ngữ mặc định nào của bạn.

Làm thế nào tôi muốn thay đổi bưu phẩm của bạn:

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 

này sẽ tạm thời thay đổi ngôn ngữ cho các chủ đề trong bưu phẩm, và sau đó, giống như một công dân tốt, nó sẽ đặt nó trở lại giá trị cũ tại kết thúc yêu cầu.

Rõ ràng, nếu bạn đang làm điều này trên tất cả các nơi, bạn muốn giải nén nó thành một phương pháp trợ giúp để kiểm soát.

+0

Cảm ơn bạn Joe đã chính xác câu trả lời của bạn. Bây giờ làm việc tốt: D. Cảm ơn bạn! – hyperrjas

3

Đây là một phương pháp tốt hơn, hy vọng nó sẽ giúp ai đó:

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 
Các vấn đề liên quan