Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Rails의 예외 디버깅

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

download_image! 이후 메소드는 after_save입니다. 콜백, 우리는 그것이 새 제품을 저장한 직후에 실행된다는 것을 알고 있습니다.

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

아하! 제품컨트롤러#만들기 product_params로 새 제품을 만듭니다. , :image_url 포함 우리가 찾고 있던 매개변수입니다.

우리는 image_url을 알고 있습니다. 속성은 깨진 URI를 빌드하는 데 사용됩니다. image_url을 남겨두면 새 제품을 만들 때 필드가 비어 있으면 문제를 성공적으로 재현할 수 있습니다.

이 경우 URI 생성 빈 문자열을 값으로 사용하면 URI::Generic이 됩니다. URI::HTTP 대신 객체 , URL 형식을 결정할 수 없기 때문입니다. 전자에는 #request_uri가 없기 때문에 메소드를 사용하면 NoMethodError가 발생합니다. Net::HTTP.get에서 .

프로젝트의 요구 사항에 따라 필드가 비어 있지 않은지 확인하는 유효성 검사를 추가하면 문제를 해결할 수 있습니다. 이미지 URL이 비어 있지 않은지 확인하는 것만으로 이 구현에서 발생할 수 있는 모든 문제가 해결되는 것은 아니지만(예:전달된 값이 URL이 아닌 경우 여전히 예외가 발생함) 좋은 시작입니다.

스택 추적을 사용하여 예외 추적

Rails의 로그는 문제를 디버깅하는 훌륭한 방법을 제공합니다. 제기된 예외가 언뜻 보기에는 항상 의미가 있는 것은 아니지만, 코드가 문제에 도달하기 위해 취한 단계를 주의 깊게 철회하는 것은 일반적으로 문제의 소스가 묻혀 있더라도 무엇이 잘못되었는지 알아내는 좋은 방법입니다 앱에서 조금 더 깊숙이.

이 기사가 얼마나 마음에 들었는지, 기사에 대해 질문이 있거나 다음에 읽고 싶은 내용이 있으면 @AppSignal로 알려주시기 바랍니다.