Ruby on Rails에서 'rescue_from'을 사용하여 컨트롤러에서 더 자세한 오류 생성
6138 단어 webdevrailsrubyprogramming
.find 대 .find_by
create
, show
및 update
경로를 생성할 때 표시되는 데이터의 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
Reference
이 문제에 관하여(Ruby on Rails에서 'rescue_from'을 사용하여 컨트롤러에서 더 자세한 오류 생성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/rossonevan/generate-more-detailed-errors-in-controllers-using-rescuefrom-in-ruby-on-rails-12i0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)