014 rescue_from 활용법
013 Rope 데이터 구조 / 절대 주관적인 루비 뉴스
레일스를 익히는 좋은 예제로 내가 자주 추천하는 Beast를 보면 이런 코드를 볼 수 있다.
- class ApplicationController
- def rescue_action(exception)
exception.is_a?(ActiveRecord::RecordInvalid) ? render_invalid_record(exception.record) : super
end
def render_invalid_record(record)
render :action => (record.new_record? ? 'new' : 'edit')
end
end
흔히 볼 수 있는 레일스 코드는 아니어서 한참을 고민했던 기억이 난다. RecordInvalid 예외를 잡아서, 해당 레코드가 비어있으면 새로 만드는 폼을 출력하고 오류가 있어서 저장이 되지 않으면 편집창을 다시 출력하는 코드이다. 대부분의 컨트롤러에서 반복되는 에러 처리 로직을 상위 클래스에서 예외로 처리하는 방식이 꽤 신선했다(그전까지 봐오고 작성했던 레일스 코드는 그렇지 않아서).
그래서 스프링노트에서도 예외를 적극 활용하고 있고, 이런 내용을 레일스에서 예외 처리 활용하기 - RescueException 플러그인라는 글에서 소개한 적이 있다.
그런데 EdgeRails에서는 좀 더 깔끔하게 예외를 처리할 수 있는데, 바로 Changeset 7597에서 소개된 rescue_from 덕분이다. 관련 내용을 블로깅하려고 생각만 하고 있다가 오늘 좋은 글을 발견해서 소개한다.
위 코드는 아래처럼 다시 쓸 수 있다.
- class ApplicationController
rescue_from ActiveRecord::RecordInvalid do |e|
render :action => (record.new_record? ? 'new' : 'edit')
end
end
rescue_action을 재정의할 필요도 없는 깔끔한 코드다.
- 2007/11/07 00:44:32
History
Last edited on 11/20/2007 23:43 by deepblue
Comments (0)