2011-12-22 13 views
11

अद्यतन: इस मुद्दे के लिए एक पैच हो गया है: https://github.com/collectiveidea/delayed_job/commit/023444424166ba2ce011bfe2d47954e79edf6798NoMethodError

अद्यतन 2: किसी को भी Heroku पर इस मामले की छानबीन विशेष रूप से चल रहा है के लिए, मैं 0.8 रेक में डाउनग्रेड करना पाया है। 7 और विलंबित जॉब संस्करण 2.1.4 कामों का उपयोग करते हुए, देरी हुई जॉब v3 नहीं है (हालांकि पैच के साथ यह स्थानीय पर काम करता है)। यह बांस-एमआर-1.9.2 स्टैक पर है।

मैं स्थानीय रूप से रेल 3.1.0 ऐप पर देरी_job को लागू करने की कोशिश कर रहा हूं। मैं प्रवास भाग गया और स्थापित मणि फ़ाइलें:

gem 'delayed_job' 
gem 'delayed_job_active_record' 

collectiveidea GitHub (https://github.com/collectiveidea/delayed_job) पर दस्तावेज़ीकरण का अनुसरण। मैं अपने नियंत्रक से देरी कॉल कर रहा हूँ इस प्रकार है:

EventMailer.delay.event_message_email(current_user, @event_message) 

इस कार्य का कारण बनता है काम तालिका में जोड़ा जा करने के लिए लेकिन जब मैं रेक नौकरियों चलाएँ:

Class#event_message_email failed with NoMethodError: undefined method `event_message_email' for Class:Class - 6 failed attempts 
: यह निम्न त्रुटि लॉग काम

मैंने SO पर अन्य देरी_job NoMethod त्रुटि प्रश्नों को देखा है लेकिन कोई भी इस विशिष्ट त्रुटि को संबोधित नहीं करता है या इसका समाधान प्रदान नहीं करता है। कलेक्टिवइडा पेज का उल्लेख है कि डिलीवरी विधि कॉल के बिना यह प्रारूप एक हैक है कि रेल 3 मेलर्स कैसे सेटअप किए जाते हैं, इसलिए मुझे आश्चर्य है कि शायद यह दस्तावेज कुछ पुराना हो सकता है, और यदि मेलर विधियों को कॉल करने का कोई नया तरीका है?

अपडेट: बिना विलंब के मेलर विधि को कॉल करना ठीक काम करता है, और मैं इसे डिफ़ॉल्ट रेल सर्वर पर चला रहा हूं, इसलिए सामूहिक पक्ष में उल्लिखित थिन के साथ समस्या लागू नहीं होती है। धन्यवाद

+0

पिछली बार जब आपने अपनी 'रेक नौकरियां: कार्य' कार्य को पुनरारंभ किया था? प्रत्येक कोड परिवर्तन के बाद इसे पुनरारंभ करने की आवश्यकता है। – iwasrobbed

+0

क्या EventMailer.event_message_email (current_user, @event_message) .delay.deliver काम करता है? – Unixmonkey

+0

@iWasRobbed: हाँ, मैंने कोशिश की है कि – tks

उत्तर

4

मैंने देरी_job (डीजे) संस्करण 2.1.2 पर स्विच करके इस समस्या को ठीक किया।

मैं उपयोग कर रहा हूँ: rvm रूबी 1.8.7 (2010-01-10 Patchlevel 249) रेल 3.0.9

Gemfile: मणि "delayed_job", '2.1.2'

मणि "delayed_job",: Git => इस से पहले मैं delayed_job के नवीनतम संस्करण का उपयोग करने की कोशिश की: मेरे लिए 'Git //github.com/collectiveidea/delayed_job.git' यह v3.0.0.pre

था

लेकिन: रेल उत्पन्न डी elayed_job माइग्रेशन फ़ाइल उत्पन्न नहीं किया था। मैंने इसे मैन्युअल रूप से बनाया है। फिर 'रेक डीबी: माइग्रेट' के बाद मुझे देरी_job कतार संग्रहित करने के लिए टेबल मिल गई है। और फिर, जब मैं सोच रहा था कि सभी को सही तरीके से काम किया जाना चाहिए, तो मुझे एक ही त्रुटि मिल गई है।

जब मैंने इस त्रुटि का स्रोत खोजने की कोशिश की, 'delayed_jobs' तालिका में मुझे पता चला है कि देरी_job के कार्यों को गलत तरीके से सहेजा गया है। यहाँ 'delayed_jobs' तालिका में क्षेत्र 'हैंडलर' से स्निपेट है:

--- !ruby/object:Delayed::PerformableMailer 
object: !ruby/class Notifier 

मुझे पता है के रूप में, delayed_job Struct वर्ग के माध्यम से सभी कार्य हो जाता है, इसलिए कार्य हैडर isntead के साथ बचाया जाना चाहिए '' गहरे लाल रंग का/struct! ' !

--- !ruby/struct:Delayed::PerformableMailer 
object: !ruby/class Notifier 

इस जांच करने के लिए मैं कंसोल में प्रक्रिया delaed_job बंद कर दिया: गहरे लाल रंग का/वस्तु ' यहाँ सही ढंग से बचाया कार्य का टुकड़ा है। तब मैं कुछ विधि कहा जाता डीबी के लिए डीजे का काम डाल करने के लिए:

Notifier.delay.some_email(current_user, @event_message) 

तो मैं मैन्युअल रूप से 'हैंडलर' फ़ील्ड में! गहरे लाल रंग का/struct 'की जगह' रूबी/वस्तु! '। फिर मैंने डीजे 'रेक नौकरियां: काम' शुरू किया, यह मुझे बताया कि मेल सफलतापूर्वक भेजा गया था।

लेकिन: - इस कार्य डीजे तालिका से हटा दिया गया था - और मेल तो मैं तय कर लिया है कि यह delayed_job के नए संस्करण में एक बग है प्राप्तकर्ता

को नहीं मिलता है। मैं डीजे '2.1.2' पर स्विच किया और यह मेरे लिए ठीक काम किया है।

पी.एस .: मेरी अंग्रेजी :)

+0

हाय से पहले रखा जाना चाहिए, विस्तृत मूल्यांकन के लिए धन्यवाद, अपवित्र। मैंने टेबल फ़ील्ड में बदलाव किया और यह नौकरी को भी मंजूरी दे दी, ऐसा लगता है कि आप सही हैं। मैंने इसे जिथब पर एक मुद्दा के रूप में खोला और इसे संदर्भ के रूप में जोड़ दिया। मैंने अभी तक 2.1.2 तक डाउनग्रेड करने की कोशिश नहीं की है, क्योंकि मैं कुछ अन्य चीजों की भी कोशिश कर रहा हूं, और मुझे चिंता है कि इससे रेल 3 मेलर्स से जुड़े मुद्दों का समाधान नहीं होगा। – tks

+0

जिस तरह से समस्या https://github.com/collectiveidea/delayed_job/issues/323 पर है, यदि आप इसका अनुसरण करना चाहते हैं – tks

+1

सुखोवी, हाय, अपना मार्ग जाने की कोशिश कर रहा है लेकिन यह पता चल रहा है कि बंडलर इस बात को नहीं दे रहा है 3.0.0.pre से पहले देरी_job के संस्करण के साथ देरी_job_active_record की स्थापना करें। Delayed_job 2.1.2 का उपयोग करने का प्रयास बिना देरी_job_active_record के काम करने के लिए प्रतीत नहीं होता है। क्या आप इस के लिए एक कामकाज प्राप्त करने में सक्षम थे? या मुझे बस इसे छोड़ देना चाहिए और resque का उपयोग करना चाहिए :)? – tks

7

Mailer.delay.send_method का उपयोग के लिए खेद है रेल 3 (वे उल्लेख यह डॉक्स में एक हैक है) में गाड़ी लगता है। मेरे पास वही NoMethodError था और दस्तावेज़ों में दिखाए गए जॉब्स बनाने के लिए वैकल्पिक विधि का उपयोग करके हल किया गया था यानी एक निष्पादन विधि के साथ एक नई नौकरी कक्षा बनाना।

class UserMailerJob < Struct.new(:text, :email) 
    def perform 
    UserMailer.your_mailer_method(text, email).deliver 
    end 
end 

फिर काम बनाने के लिए, मेरे नियंत्रक में:

Delayed::Job.enqueue UserMailerJob.new(@text, @email) 

यह देरी का उपयोग करने से यह करने के लिए थोड़ा लंबा है, लेकिन यह नौकरियों सही ढंग से बना सकते हैं और मज़बूती से कार्रवाई करने के लिए लगता है।

0

बस एक त्वरित नोट। मुझे यह समस्या थी और ऐसा इसलिए था क्योंकि मैं मॉडल से एक चर को वितरित करने के तरीके BEFORE_SAVE में पास कर रहा था। AFTER_CREATE को स्विच करने से मेरे लिए समस्या ठीक हो गई।

संबंधित मुद्दे