2013-01-21 11 views
5

मैं delayed_job साथ इस कार्य हैविलंबित नौकरी 3

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

ईमेल उचित स्थान/भाषा पर भेज दिया जाता है ।

हालांकि देरी_job उचित लोकेल/भाषा को नहीं पहचानता है।

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

मेलर कोड::

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 

मैं इस समस्या को कैसे ठीक कर सकता इस मामले मैं locale = params[:locale] साथ स्थान में मिलता है पर, आप अगले उदाहरण देख सकते हैं?

+0

आपका क्या मतलब है 'delayed_job उचित स्थान नहीं पहचानता है'? क्या आप 'डिलीवरी' जोड़ना चाहते हैं? –

+0

यदि आप देरी_job विधि में '.deliver' विधि जोड़ते हैं, तो आपको एक त्रुटि मिल जाएगी। मेरा मतलब है कि भेजे गए ईमेल, उनकी उचित भाषा पर नहीं भेजे जाते हैं। भाषा, पैराम [: लोकेल] के साथ मेरी विधि पर प्राप्त की गई है। धन्यवाद! – hyperrjas

+0

पैराम्स [: लोकेल]? यह सही नहीं लगता है। क्या आपका मतलब है कि आप कार्य के अंदर स्थानीय परिवर्तनीय लोकेल का संदर्भ देते हैं, क्योंकि यह एकमात्र तरीका है जो यह काम करेगा। –

उत्तर

1

ठीक है, सबसे पहले, मुझे लगता है कि आपका 'मौजूदा' मेलर कोड काम कर रहा है जब यह डीजे में नहीं है।

आपका लोकेल I18n.locale के माध्यम से सेट किया गया है। यह थ्रेड विशिष्ट स्तर पर सेट है ... इसलिए, यह मानते हुए कि आप उपयोगकर्ता के लिए कहीं भी I18n.locale सेट कर रहे हैं, तो रेल इसका उपयोग करने के लिए उपयोग कर रहे हैं।

हालांकि, डीजे पूरी तरह से एक अलग प्रक्रिया का उपयोग करेगा ... इसलिए यह लोकेल का वारिस नहीं कर सकता! इसका मतलब यह है कि यह आपके डिफ़ॉल्ट लोकेल के लिए वापस आ जाएगा।

मैं अपने मेलर कैसे बदल देंगे:

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

धन्यवाद धन्यवाद जो आपकी प्रतिक्रिया सही है। अब ठीक काम कर रहा है: डी। धन्यवाद! – 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 
संबंधित मुद्दे