Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

रेल में डिबगिंग अपवाद

जब आपके रेल एप्लिकेशन में कोई त्रुटि होती है, तो अपवाद और स्टैक ट्रेस आपको यह पता लगाने में मदद करते हैं कि समस्या कहां हुई। कहां क्या हुआ, यह जानने के बाद हमें क्यों . का पता लगाना होगा यह हुआ। इस लेख में, हम रेल एप्लिकेशन में बग खोजने के लिए बैकट्रेस का उपयोग करेंगे।

NoMethodError (undefined method `request_uri' for #<URI::Generic >):

app/models/product.rb:8:in `download_image!'
app/controllers/products_controller.rb:5:in `create'

इस उदाहरण अपवाद में, हमें एक NoMethodError प्राप्त हुआ है # . के लिए अपरिभाषित विधि `request_uri' के साथ इसके संदेश के रूप में। चूंकि यह अपवाद हमें तुरंत यह नहीं बताता कि समस्या क्या है, हमें यह पता लगाने के लिए स्टैक ट्रेस का निरीक्षण करना होगा कि क्या हुआ।

app/models/product.rb:8:in `download_image!'
app/controllers/products_controller.rb:5:in `create'

स्टैक ट्रेस को देखते हुए, हम सीखते हैं कि अपवाद एक download_image! . से उठाया गया था उत्पाद . पर विधि नमूना। हम कोड में अपनी जांच जारी रखेंगे, और यह पता लगाने के लिए कि क्या गलत हो रहा है, हम स्टैक ट्रेस के नीचे अपना काम करेंगे।

मॉडल खोलने से पता चलता है कि लाइन 8 (जहां से अपवाद उठाया गया था) Net::HTTP.get(uri) कॉल करता है , तो ऐसा लगता है कि uri वह वस्तु नहीं है जिसकी हम अपेक्षा करते हैं।

require 'net/http'
 
class Product < ApplicationRecord
  after_save :download_image!
 
  def download_image!
    uri = URI(image_url)
    contents = Net::HTTP.get(uri)
 
    File.open("public#{local_image_path}", 'wb') do |file|
      file.write contents
    end
  end
 
  def local_image_path
    "/product_#{id}.png"
  end
end

चूंकि download_image! विधि एक after_save है कॉलबैक, हम जानते हैं कि एक नया उत्पाद सहेजने के तुरंत बाद इसे निष्पादित किया जाता है।

यूरी वेरिएबल image_url . नामक विधि से बनाया गया है लाइन 7 पर। यह पता लगाने के लिए कि यह कहां से आता है, हम Product#create देखने के लिए स्टैक ट्रेस पर एक और नज़र डालेंगे। विधि को ProductsController#create से कहा जाता है ।

class ProductsController < ApplicationController
  def create
    @product = Product.new(product_params)
 
    if @product.save
      redirect_to @product, notice: 'Product was successfully created.'
    else
      render :new
    end
  end
 
  private
    def product_params
      params.require(:product).permit(:title, :description, :image_url, :price)
    end
end

आह! उत्पाद नियंत्रक#बनाएं product_params . के साथ एक नया उत्पाद बनाता है , जिसमें :image_url . शामिल है पैरामीटर जिसे हम ढूंढ रहे थे।

हम जानते हैं image_url टूटी हुई यूआरआई बनाने के लिए विशेषता का उपयोग किया जाता है। अगर हम image_url छोड़ देते हैं एक नया उत्पाद बनाते समय खाली फ़ील्ड, हम समस्या को सफलतापूर्वक पुन:उत्पन्न कर सकते हैं।

इस मामले में, URI . बनाना एक खाली स्ट्रिंग के साथ इसका मान URI::Generic . में परिणत होता है URI::HTTP . के बजाय ऑब्जेक्ट , क्योंकि यह URL के प्रारूप को निर्धारित नहीं कर सकता है। चूंकि पहले वाले के पास #request_uri नहीं है विधि, यह एक NoMethodError उठाती है Net::HTTP.get . से ।

प्रोजेक्ट की आवश्यकताओं के आधार पर, यह सुनिश्चित करने के लिए सत्यापन जोड़ना कि फ़ील्ड खाली नहीं है, समस्या को ठीक कर सकता है। केवल यह सुनिश्चित करने के लिए सत्यापित करने से कि छवि URL खाली नहीं है, इस कार्यान्वयन की सभी संभावित समस्याओं को ठीक नहीं करेगा (उदाहरण के लिए, पारित मान URL नहीं होने पर भी हमें एक अपवाद मिलेगा), लेकिन यह एक अच्छी शुरुआत है।

स्टैक ट्रेस का उपयोग करके अपवादों को ट्रैक करना

रेल के लॉग मुद्दों को डीबग करने का एक शानदार तरीका प्रदान करते हैं। हालांकि उठाए गए अपवाद हमेशा पहली नज़र में बहुत मायने नहीं रखते हैं, इस मुद्दे पर पहुंचने के लिए कोड द्वारा उठाए गए कदमों को ध्यान से वापस लेना आमतौर पर यह पता लगाने का एक शानदार तरीका है कि क्या गलत हुआ, भले ही समस्या का स्रोत दब गया हो आपके ऐप में थोड़ा गहरा।

हमें यह जानना अच्छा लगेगा कि आपको यह लेख कैसा लगा, यदि इसके बारे में आपके कोई प्रश्न हैं, और आप आगे क्या पढ़ना चाहते हैं, तो हमें @AppSignal पर बताना सुनिश्चित करें।


  1. बायबग, रेल और पाउ ​​के साथ रिमोट डिबगिंग

    यदि आपने पहले बायबग नहीं देखा है, तो मेरा सुझाव है कि आप इसे देखें। रूबी 2.x के लिए यह एक अच्छा डीबगर है। इसके लेखकों के शब्दों में: Byebug रूबी 2 के लिए उपयोग करने के लिए एक आसान, सुविधा संपन्न डिबगर है। यह निष्पादन नियंत्रण के लिए नए TracePoint API और कॉल स्टैक नेविगेशन के लिए नए डीबग इंस्पेक्टर A

  1. एडब्ल्यूएस लैम्ब्डा के लिए रेल की तैनाती

    सर्वर रहित कंप्यूटिंग एक क्लाउड प्रदाता को सर्वर के प्रबंधन और प्रावधान के काम को उतारने में मदद करती है और तेजी से अधिकांश प्रौद्योगिकी टीमों के लिए एक चीज बन रही है। AWS लैम्ब्डा एक प्रकार की सर्वर रहित तकनीक है जिसका उपयोग कई तकनीकी टीमों द्वारा किया जाता है। AWS लैम्ब्डा NodeJS, Java, Python और

  1. रेल के साथ कोणीय का उपयोग करना 5

    आपने पहले कहानी सुनी है। आपके पास पहले से ही आपके विकेन्द्रीकृत और पूरी तरह से काम कर रहे बैक-एंड एपीआई और किसी भी सामान्य टूलसेट से बने फ्रंट-एंड पर चलने वाला एक एप्लिकेशन है। अब, आप कोणीय पर आगे बढ़ना चाहते हैं। या, शायद आप अपनी रेल परियोजनाओं के साथ एंगुलर को एकीकृत करने का एक तरीका ढूंढ रहे हैं