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