আপনার Rails অ্যাপ্লিকেশনে একটি ত্রুটি ঘটলে, ব্যতিক্রম এবং স্ট্যাক ট্রেস আপনাকে কোথায় সমস্যাটি ঘটেছে তা খুঁজে পেতে সহায়তা করে। কোথায় কী ঘটেছে তা জানার পরে, আমাদের কেন খুঁজে বের করতে হবে এটা ঘটেছে. এই নিবন্ধে, আমরা একটি Rails অ্যাপ্লিকেশনে একটি বাগ খুঁজে বের করতে ব্যাকট্রেস ব্যবহার করব৷
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
যেহেতু ডাউনলোড_ইমেজ!
পদ্ধতি হল একটি আফটার_সেভ
কলব্যাক, আমরা জানি এটি একটি নতুন পণ্য সংরক্ষণ করার সাথে সাথেই কার্যকর করা হয়৷
uri
ভেরিয়েবলটি 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
আহা! ProductsController#create
product_params
দিয়ে একটি নতুন পণ্য তৈরি করে , যার মধ্যে রয়েছে :image_url
প্যারামিটার আমরা খুঁজছিলাম।
আমরা image_url
জানি এট্রিবিউট ভাঙা ইউআরআই তৈরি করতে ব্যবহৃত হয়। যদি আমরা image_url
ছেড়ে দেই একটি নতুন পণ্য তৈরি করার সময় ক্ষেত্র খালি থাকলে, আমরা সফলভাবে সমস্যাটি পুনরুত্পাদন করতে পারি।
এই ক্ষেত্রে, URI
তৈরি করুন একটি খালি স্ট্রিং সহ এটির মান একটি URI::Generic
এ পরিণত হয় একটি URI::HTTP
এর পরিবর্তে বস্তু , কারণ এটি URL এর বিন্যাস নির্ধারণ করতে পারে না। যেহেতু আগেরটির কোনো #request_uri
নেই পদ্ধতি, এটি একটি NoMethodError
উত্থাপন করে Net::HTTP.get
থেকে .
প্রকল্পের প্রয়োজনীয়তার উপর নির্ভর করে, ক্ষেত্রটি খালি নেই তা নিশ্চিত করার জন্য একটি বৈধতা যোগ করলে সমস্যাটি সমাধান করা যেতে পারে। শুধুমাত্র ইমেজ ইউআরএলটি খালি নয় তা নিশ্চিত করার জন্য যাচাই করা এই বাস্তবায়নের সাথে সমস্ত সম্ভাব্য সমস্যার সমাধান করবে না (উদাহরণস্বরূপ পাস করা মানটি URL না হলে আমরা এখনও একটি ব্যতিক্রম পাব), তবে এটি একটি ভাল শুরু। পি>
স্ট্যাক ট্রেস ব্যবহার করে ব্যতিক্রমগুলি ট্র্যাক করা
রেলের লগগুলি সমস্যাগুলি ডিবাগ করার একটি দুর্দান্ত উপায় সরবরাহ করে। যদিও উত্থাপিত ব্যতিক্রমগুলি সর্বদা প্রথম নজরে খুব বেশি অর্থবোধ করে না, সমস্যাটি পেতে কোডটি নেওয়া পদক্ষেপগুলি সাবধানতার সাথে প্রত্যাহার করা সাধারণত কী ভুল হয়েছে তা খুঁজে বের করার একটি দুর্দান্ত উপায়, এমনকি যদি সমস্যার উত্সটি সমাহিত করা হয় আপনার অ্যাপের একটু গভীরে।
আমরা জানতে চাই যে আপনি এই নিবন্ধটি কেমন পছন্দ করেছেন, যদি এটি সম্পর্কে আপনার কোন প্রশ্ন থাকে এবং আপনি পরবর্তীতে কী পড়তে চান, তাই @AppSignal-এ আমাদের জানাতে ভুলবেন না।