কম্পিউটার

রেলে ডিবাগিং ব্যতিক্রম

আপনার 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-এ আমাদের জানাতে ভুলবেন না।


  1. রেলের সাথে হটওয়্যার ব্যবহার করা

  2. বাইবাগ, রেল এবং পা দিয়ে রিমোট ডিবাগিং

  3. AWS Lambda এ রেল স্থাপন করা হচ্ছে

  4. রেলের সাথে কৌণিক ব্যবহার 5