যখন আপনার রেইলস অ্যাপ্লিকেশনে একটি এরর হয়, এক্সেপশন এবং স্ট্যাক ট্রেস আপনাকে খুঁজে বের করতে সাহায্য করে সমস্যা কোথায় ঘটেছে। কী ঘটেছে কোথায় জানার পর, আমাদের জানতে হবে কেন হয়েছে। এই আর্টিকেলে, আমরা ব্যাকট্রেস ব্যবহার করে একটি রেইলস অ্যাপ্লিকেশনে বাগ খুঁজে বের করার পদ্ধতি নিয়ে আলোচনা করব।
NoMethodError (undefined method `request_uri' for #):
app/models/product.rb:8:in `download_image!'
app/controllers/products_controller.rb:5:in `create'
এই উদাহরণ এক্সেপশনে, আমরা একটি NoMethodError পেলাম undefined method `request_uri' for # মেসেজ সহ। যেহেতু এই এক্সেপশন আমাদের সমস্যা কী সেটা সরাসরি বলছে না, আমাদের স্ট্যাক ট্রেস ইনস্পেক্ট করতে হবে কী ঘটেছে সেটা বের করতে।
app/models/product.rb:8:in `download_image!'
app/controllers/products_controller.rb:5:in `create'
স্ট্যাক ট্রেস দেখলে, আমরা জানি এক্সেপশনটি Product মডেলের download_image! মেথড থেকে রেইজ হয়েছে। আমরা কোডে আমাদের তদন্ত চালিয়ে যাব, এবং স্ট্যাক ট্রেস নিচের দিকে যাব কী ভুল হচ্ছে সেটা বের করতে।
মডেল খুললে দেখা যায় লাইন ৮ (যেখান থেকে এক্সেপশন রেইজ হয়েছে) 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 কলব্যাক, আমরা জানি এটি একটি নতুন প্রোডাক্ট সেভ করার তুর بعد এক্সিকিউট হয়।
uri ভেরিয়েবল লাইন ৭-এ একটি মেথড নামক image_url থেকে বিল্ড হয়েছে। সেটি কোথা থেকে আসে সেটা বের করতে, আমরা একবার আর স্ট্যাক ট্রেসে তাকিয়ে দেখব 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
আহা! ProductsController#create product_params দিয়ে একটি নতুন প্রোডাক্ট তৈরি করে, যাতে :image_url প্যারামিটার আছে যা আমরা খুঁজছিলাম।
আমরা জানি image_url অ্যাট্রিবিউটটি brukken URI বানাতে ব্যবহৃত হয়েছে। যদি আমরা একটি নতুন প্রোডাক্ট তৈরি করার সময় image_url ফিল্ড খালি রেখে দি, আমরা সমস্যাটি সফলভাবে রিপ্রোডিউস করতে পারি।
এই কেসে, একটি খালি স্ট্রিং দিয়ে URI তৈরি করলে একটা URI::Generic অবজেক্ট তৈরি হয় URI::HTTP এর বদলে, কারণ সেটি URL-এর ফরম্যাট নির্ধারণ করতে পারে না। যেহেতু পুরনোটি #request_uri মেথড নেই, সেটি Net::HTTP.get- থেকে NoMethodError রেইজ করে।
প্রজেক্টের রিকোয়ারমেন্টের উপর নির্ভর করে, ফিল্ড খালি নয় সেটা নিশ্চিত করার জন্য একটি ভ্যালিডেশন যোগ করা সমস্যা সমাধান করতে পারে। শুধু ভ্যালিডেশন করে ইমেজ URL খালি নয় সেটা নিশ্চিত করলে এই ইমপ্লিমেন্টেশনের সব সম্ভাব্য সমস্যা ফিক্স হবena (আমরা এক্সেপশন পাবো এখনো যখন পাস করা ভ্যালু URL নয়), কিন্তু এটা একটি ভালো শুরু।
স্ট্যাক ট্রেস ব্যবহার করে এক্সেপশন ট্র্যাক ডাউন করা
রেইলসের লগ ইস্যু ডিবাগ করার একটি চমৎকার উপায় প্রদান করে। যদিও রেইজড এক্সেপশন প্রথম নজরে সবসময় সেন্স না করেও, কোড যা যা ধাপ নিয়ে সমস্যাতك পৌঁছেছে সেটি সতর্কতার সাথে পেছনে ফেরত যাওয়া সাধারণত একটি চমৎকার উপায় কী ভুল হয়েছে সেটা বের করার, এমনকি যদি সমস্যায়ের উৎস আপনার অ্যাপে একটু গভীরে দফন থাকে।
আমরা জানতে চাই আপনি এই আর্টিকেল কেমন লাগলো, আপনার কোনো প্রশ্ন আছে কিনা, এবং আপনি কী নিয়ে পড়তে চান, তাই @AppSignal-এ আমাদের জানাতে ভুলবেন না।