|  |  |
|
XML 문서 다운로드
일반적으로 레일스 컨트롤러에 있는 액션 메서드의 목적은 뷰를 렌더링하여 요청한 클라이언트에 전달하는 것이다. 뷰는 보통 RHTML이나 RJS 파일 같은 것을 말한다. 하지만 레일스의 응답을 곧바로 가로채서 전혀 다른 무엇인가를 보내고 싶을 때는 어떻게 해야 할까? 그것이 이번 섹션에서 다룰 내용이다.
레일스 응답 가로채기
때로는 생성된 파일(이 예제에서는 XML) 등의 고유 내용을 렌더링하여 클라이언트에 보내고 싶을 때가 있다. 어떤 경우는 그것이 PDF 문서나 점으로 구분된 값들일 수도 있고, 아니면 아예 다른 포맷의 데이터일 수도 있을 것이다. 레일스에서는 응답을 가로채서 개발자가 원하는 데이터를 보내는 것이 매우 짧은 코드로 가능하다. main_controller.rb에서 생성된 XML 파일을 클라이언트의 브라우저에 sample.xml이란 파일로 다운로드할 수 있도록 전송하는 부분을 담당하는 메서드를 보자(Listing 20).
Listing 20. 클라이언트에 커스텀 데이터를 보내기 위한 레일스 응답 가로채기
def hijack_response( out_data )
send_data( out_data, :type => "text/xml", :filename => "sample.xml" )
end
|
정말로 쉽지 않은가? 이 경우, out_data는 생성된 XML 내용을 담고 있는 문자열 인스턴스이고, "text/xml"은 응답에 설정될 마임 타입(mine type), 그리고 "sample.xml"은 클라이언트가 다운로드를 시도하게 될 파일의 이름을 나타낸다. send_data 메서드는 ActionController::Streaming 모듈의 보호된(protected) 인스턴스 메서드다. ActionController::Streaming 모듈은 ActionController::Base에 믹스인되고, main_controller.rb의 MainController가 이 클래스를 상속받는다(Listing 21).
Listing 21. 레일스 컨트롤러 클래스 계층
ActionController::Base (Part of the Rails framework)
|
-- ApplicationController (application.rb - generated for you)
|
-- MainController (main_controller.rb - your controller)
|
모듈과 믹스인(mixin)은 이 튜토리얼의 범위를 벗어나는 주제이므로, 더 자세한 정보를 얻고 싶으면 참고자료를 찾아보기 바란다. 이제 XML이 만들어졌으니 이것을 가지고 뭔가 해보자.
|  |
|