Ruby on Rails에서 'rescue_from'을 사용하여 컨트롤러에서 더 자세한 오류 생성

웹 페이지 애플리케이션의 가장 중요한 부분은 사용자가 앱 전체에서 상호 작용할 때 문제가 발생하는 이유를 더 잘 이해할 수 있도록 오류를 제공하면서 사용자에게 정보를 반환하는 것입니다. Application Controller를 통해 Front-end가 Back-end에서 생성된 데이터베이스와 상호작용할 수 있도록 CRUD(Create, Read, Update, Destroy) 방식을 개발한다.

.find 대 .find_by


create , showupdate 경로를 생성할 때 표시되는 데이터의 ID를 찾아야 합니다. ID를 찾을 수 없으면 오류가 발생합니다. 예를 들어 영화 컨트롤러에 show 메서드가 있다고 가정해 보겠습니다.

class MoviesController < ApplicationController
  def show
    movie = Movie.find_by(id: params[:id])
    if movie
      render json: movie, status: :ok
    else
      render json: {error: "Movie not found"}, status: :not_found
    end
  end
 end

.find_by 를 사용하여 동영상을 찾을 수 없는 경우 반환 값은 nil입니다. 따라서 사용자에게 표시하는 데 사용할 오류를 생성하려면 if/else 문을 공식화해야 합니다.

또한 Ruby에서 제공하는 rescue를 사용하여 예외를 처리하고 오류로 사용할 수 있으므로 if/else 문을 보다 DRY 접근 방식으로 대체할 수 있습니다.

class MoviesController < ApplicationController
  def show
    movie = Movie.find_by(id: params[:id])
    render json: movie, status: :ok
rescue ActiveRecord::RecordNotFound
  render json: {error: "Movie not found"}, status: :not_found
  end
 end


그러나 오류를 처리하는 훨씬 더 DRY-er 방법이 있습니다. .find 메서드를 사용하면 ActiveRecord는 더 자세한 오류가 포함된 예외를 반환합니다. 예를 들어 localhost:3000/movies/99에 가져오기 요청을 하면 예외는 다음과 같습니다.

ActiveRecord::RecordNotFound (Couldn't find Movie with 'id'=99)


이 예외를 사용하여 오류를 생성하고 RecordNotFound 오류가 있는 모든 컨트롤러에 적용할 수 있지만 ApplicationController에 구조를 작성할 수 있습니다.

class ApplicationController < ActionController::API
  rescue_from ActiveRecord::RecordNotFound, with: :record_not_found
  private
  def record_not_found(error)
    render json: {error: error.message}, status: :not_found
  end
end


오류는 "최상위"컨트롤러 내에서 처리되기 때문에 MoviesController의 메서드는 오류를 포함할 필요가 없으므로 더 많은 DRY 형식을 만듭니다.

class MoviesController < ApplicationController
  def show
    movie = Movie.find(params[:id])
    render json: movie, status: :ok
  end
 end

좋은 웹페이지 즐겨찾기