티스토리 뷰

응답


액션에서의 처리 결과를 출력하기 위한 메서드가 있습니다. (줄여서 응답 메서드라고 하겠습니다.) 액션 메서드에서는 기본적으로 이러한 메서드를 모두 사용해 응답을 생성합니다.


 메서드

설명 

render 

템플릿 호출 또는 글자/스크립트 출력 등, 범용적인 출력 

redirect_to 

지정된 주소로 처리를 리다이렉트 

send_file 

지정된 파일을 출력 

send_data 

지정된 바이너리 데이터를 출력 



템플릿 파일을 출력 - render 메서드


응답에서 가장 많이 사용되는 기본적인 메서드가 render입니다. 

액션에서 명시적으로 응답 메서드를 호출하지 않으면 자동으로 render 메서드가 호출되어 템플릿 파일을 실행.


1. 액션 이름과 다른 이름의 템플릿 호출

예) ctrl#res_render 액션 => ctrl/res_render.html.erb   기본적으로 컨트롤러명, 액션명에 따라서 호출되는 템플릿 이름이 정해집니다.


하지만! ctrl/index.html.erb를 호출하고 싶다면, action 옵션을 사용해서 다음과 같이 입력합니다.

render action: 'index'

** action 옵션은 템플릿을 호출하는 것이지, index액션(메서드)가 호출되는 것이 아닙니다.


2. 다른 폴더의 템플릿을 호출

action옵션 : 현재 컨트롤러를 기점으로 템플릿을 찾아 호출. 따라서 현재 컨트롤러가 ctrl이고 action: 'index' 이면 ctrl/index.html.erb를 호출한다.  다른 컨트롤러 내부의 템플릿을 호출하고 싶다면 template 옵션 사용.

render template: 'hello/view'


3. 어플리케이션 외부의 템플릿 호출

어플리케이션 외부에 위치하는 템플릿을 사용하는 경우

render file: 'data/template/list'


이렇게 하면 윈도우의 경우 "c:\data\template\list.html.erb"가 호출 됩니다.



여러 번 렌더링(자주 보는 에러메시지)


render 메서드를 사용할 때 "액션 내부에서 렌더 또는 리다이렉트를 여러번 할 수 없습니다."라는 오류가 뜨는 경우를 볼 수 있습니다.


def double_render
@book = Book.find(6)
if @book.reviews.empty?
render 'simple_info'
end
render 'details_info'
end

위와 같이 if문이 true이면 'simple_info' 템플릿으로 이동하고, false이면 'details_info'로 이동한다고 생각할 수 있지만 실제로는 simple_info를 렌더하고 그 다음에 details_info를 렌더한다. 그래서 return을 사용하여 명시적으로 종료해 주어야 한다. render 'simple_info' and return처럼 액션을 명시적으로 종료시켜야 한다. 



빈 내용 출력 - render와 head 메서드


내용을 출력하지 않고 그냥 처리 결과(상태 코드)만 받고 싶은 경우가 있습니다. 

이런 경우는 render 메서드의 nothing옵션 또는 head 메서드를 사용합니다.


1. render 메서드를 사용하는 경우

nothing 옵션을 true로 지정하면 내용없이 응답할 수 있습니다.


render nothing: true, status: 404


2. head 메서드를 사용하는 경우

head메서드는 상태코드와 응답 헤더에 특화된 메서드입니다.


구문 : head 메서드 

 head status [ ,opt]

 status: 상태코드

 opt: 응답 헤더<<헤더 이름>>: <값>의 형식



 심볼

상태 코드

의미 

:ok 

 200

 성공

 :created

 201

 리소스 생성 성공

 :moved_permanently

 301

 리소스가 영구적으로 이동한 상태

 :found

 302

 리소스가 일시적으로 이동한 상태

 :see_other

 303

 리소스가 다른 장소에 존재

 :unauthorized

 401

 인증 요구

 :forbidden

 403

 요청 거부

 :not_found

 404

 리소스가 존재하지 않는 경우

 :method_not_allowed

 405

 HTTP 메서드가 허가되지 않음




리다이렉트 처리 - redirect_to 메서드



구문 redirect_to 메서드 

 redirect_to url [,status=302]

 url : 리다이렉트 대상 url

 status: 상태코드(숫자 또는 심볼)


redirect_to 'http://www.wings.msn.to'.      #절대경로

redirect_to action: :index                           #같은 컨트롤러의 액션

redirect_to controller: :hello, action: :list.  #다른 컨트롤러의 액션

redirect_to books_path                               #자동 생성된 뷰 헬퍼

redirect_to :back                                         # 이전 페이지

























































댓글