2013-08-14 5 views
0

저는 루비를 처음 사용합니다. 한 번의 클릭으로 두 개의 파일을 내보내려면 어떻게해야합니까?Ruby에서 FasterCSV를 사용하여 CSV 파일을 여러 개 만드는 방법

exsiting 버전에서는 'def stream_csv'를 호출하여 한 번에 하나의 파일 만 생성 할 수 있지만 두 파일을 가져 오기 위해 두 번 호출하려고하면 "ActionController :: DoubleRenderError (동작 당 한 번만 렌더링 또는 리디렉션 할 수 있음) : "렌더링 때문입니다.

def stream_csv 
    require 'fastercsv' 

     filename = params[:action] + ".csv" 

     #this is required if you want this to work with IE  
     if request.env['HTTP_USER_AGENT'] =~ /msie/i 
      headers['Pragma'] = 'public' 
      headers["Content-type"] = "text/plain" 
      headers['Cache-Control'] = 'no-cache, must-revalidate, post-check=0, pre-check=0' 
      headers['Content-Disposition'] = "attachment; filename=\"#{filename}\"" 
      headers['Expires'] = "0" 
     else 
      headers["Content-Type"] ||= 'text/csv' 
      headers["Content-Disposition"] = "attachment; filename=\"#{filename}\"" 
      controller.response.headers["Content-Transfer-Encoding"] = "binary" 
     end 

     render :text => Proc.new { |response, output| 
      csv = FasterCSV.new(output, :row_sep => "\r\n") 
      yield csv 
     } 
    end 
end 

이 가능 한 번의 클릭에서 두 개의 파일을 만들려면 여기

는 stream_csv의 소스 코드? 그렇다면 어떻게 할 수 있습니까?

답변

2

맞아요, render 때문입니다. headers을 설정하고 나서 마지막으로 render을 호출하면 HTTP 응답을 작성하여 브라우저에 보냅니다. 하나의 HTTP 요청에서이 작업을 두 번 수행 할 수 없기 때문에 ActionController::DoubleRenderError을 얻게됩니다. 한 번에 여러 .csv 파일을 보낼 수

한 가지 방법은 그 대신 .csv 원시의 파일을 하나의 .zip 파일로 결합하고 을 보내는 것입니다. 우수하고 사용하기가 매우 편리합니다. rubyzip gem.zip 파일을 만드는 데 사용할 수 있습니다.

stream_csv 안에 render를 호출하는 대신 FasterCSV 인스턴스 또는 문자열 출력 만 반환하면됩니다. 호출 메소드에서 .zip 파일 을 빌드 할 수 있습니다 (위의 젬에서 README을 복사하여 붙여 넣기 만 했으므로 코드를 포함하지 않습니다).

마지막으로, 대신에 다운로드를 강제로 이렇게 많은 헤더를 설정하는, 레일 아주 명확한 explaination를 포함 send_file 방법 당신의 도움에 대한

+0

감사합니다 :) – Fon

+0

마지막으로, 나는 그것이 완벽하게 작동 얻었다를보십시오. 다시 한 번 감사드립니다! :) – Fon

+0

도움이되기를 기쁜 마음으로, 그리고 코드를 직접 정렬하는 데 도움이됩니다. – deefour