6

मैं इस तरह के रूपActiveJob बचाव में पैरामीटर प्रदर्शन

def perform object 
end 

rescue_from Exception do |e| 
    if e.class != ActiveRecord::RecordNotFound 
     **job.arguments.first** 
     # do something 
    end 
end 

आप कैसे उपयोग करते हैं ActiveJob resue ब्लॉक में मानकों प्रदर्शन पर सोच रहा हूँ, उपयोग करने के लिए कैसे धन्यवाद !!

+0

अपवाद कहां है? प्रदर्शन विधि में? यदि ऐसा है, तो बस प्रदर्शन विधि के भीतर अपराधी कोड के नीचे अपना बचाव ब्लॉक रखें। आपके पास 'ऑब्जेक्ट' पैरामीटर तक स्थानीय चर के रूप में पहुंच होगी। – Noz

+0

नोज़, मेरे पास पहले_enqueue और आस-पास के साथ-साथ rescue_from भी है। – ConfusedUser

+0

मैंने पहले उनमें से किसी का भी उपयोग नहीं किया है, लेकिन क्या आप अपने ब्लॉक ब्लॉक को उन ब्लॉकों में से किसी एक में नहीं डाल सकते हैं? मुझे नहीं लगता कि आप अपने ActiveJob में 'rescue_from' का उपयोग करना चाहते हैं, एक सरल' बचाव ActoveRecord :: RecordNotFound => e' पर्याप्त होना चाहिए। – Noz

उत्तर

2

मुझे उस पर कोई जानकारी नहीं थी, फिर rescue_from ब्लॉक के अंदर self का प्रयास करने और उपयोग करने का निर्णय लिया गया, और यह काम किया।

rescue_from(StandardError) do |ex| 
    puts ex.inspect 
    puts self.job_id 
    # etc. 
end 

एक तरफ ध्यान दें के रूप में - कभी कभी Exception बचाव:

rescue_from(StandardError) do |exception| 
    user = arguments[0] 
    post = arguments[1] 
    # ...  
end 

def perform(user, post) 
    # ... 
end 

यह भी रूप में कॉलबैक के लिए काम करता है:

Why is it a bad style to `rescue Exception => e` in Ruby?

6

यह rescue_from ब्लॉक के अंदर arguments के साथ संभव है अच्छा (उदाहरण के अंदर after_perform)।

+0

यह मेरे लिए रेल 5.0.0.1 में काम नहीं करता है। – Vadim

+2

धन्यवाद, यह मेरे लिए काम करता है (रेल 5.0.1, साइडकीक 4.2.9)। 'Rescue_from' ब्लॉक में,' तर्क [0] 'ने मुझे पहला तर्क दिया जो' निष्पादित 'करने के लिए पारित किया गया था। – DelPiero

+2

यह मेरे लिए रेल 5.0.2 पर भी काम करता है – fguillen

1

आप ex.bindings द्वारा सभी Bindings तक पहुंच सकते हैं। सुनिश्चित करें कि आप अपने काम के लिए सही बाध्यकारी प्राप्त करने के लिए आप इस तरह रिसीवर की जांच होनी चाहिए:

method_binding = ex.bindings.find { |b| b.receiver.is_a?(self.class) } 

तो फिर तुम .local_variable_get के साथ सभी स्थानीय चर मिल सकती है। तो अगर आप उदाहरण के लिए

user = method_binding.local_variable_get(:user) 
post = method_binding.local_variable_get(:post) 

:: चूंकि विधि तर्क भी स्थानीय चर रहे हैं, आप कम से कम उन्हें स्पष्ट रूप से प्राप्त कर सके

def perform object 
end 

rescue_from Exception do |e| 
    if e.class != ActiveRecord::RecordNotFound 
     method_binding = ex.bindings.find { |b| b.receiver.is_a?(self.class) } 
     object = method_binding.local_variable_get(:object) 
     # do something 
    end 
end 

1. यह अभी भी संभव है कि यह बाध्यकारी से एक नहीं है perform यदि आप अपने काम की प्रदर्शन विधि में अन्य उदाहरण विधियों को कॉल करते हैं और त्रुटि वहां होती है। इसे ध्यान में भी लिया जा सकता है लेकिन ब्रेवटी के लिए छोड़ दिया जाता है।

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