2011-01-03 8 views
14

사용자에게 CSV로 표를 내보낼 수있는 기능을 제공하고 싶습니다.레일 - CSV 내보내기 : 파일 다운로드 확인

respond_to :html, :js, :csv 

요구 된 형식이 CSV 인 경우 나 또한 헤더를 설정하고 있습니다 : generate_csv_headers에 대한

if params[:format] == 'csv' 
    generate_csv_headers("negotiations-#{Time.now.strftime("%Y%m%d")}") 
end 

코드 내 컨트롤러에 따라서

, 나는 파일의 상단에 추가 한 (application_controller에)입니다 :

def generate_csv_headers(filename) 
    headers.merge!({ 
     'Cache-Control'    => 'must-revalidate, post-check=0, pre-check=0', 
     'Content-Type'    => 'text/csv', 
     'Content-Disposition'  => "attachment; filename=\"#{filename}\"", 
     'Content-Transfer-Encoding' => 'binary' 
    }) 
    end 

가 나는 또한라는 뷰를 만들었습니다내 파일 생성 :

<%- headers = ["Id", "Name"] -%> 
<%= CSV.generate_line headers %> 
<%- @negotiations.each do |n| -%> 
<%- row = [ n.id, 
      n.name ] -%> 
<%= CSV.generate_line row %> 
<%- end -%> 

내가 오류를 필요는 없습니다,하지만 난 파일을 다운로드 브라우저에서 프롬프트를 기대하면서 단순히 CSV 파일의 내용을 표시합니다.

많은 것을 읽었지만 작동 할만한 것을 찾을 수 없습니다. 아이디어가 있으십니까?

감사합니다.

+0

[이 SO 스레드]에서이 주제에 대한 좋은 토론 (http://stackoverflow.com/questions/94502/in-rails-how-to-return-records-as-a-csv -file) – zetetic

답변

10

아직도 문제가 해결 된 이유는 확실하지 않지만 그 이유는 확실하지 않습니다.

나는

<%= link_to "Export to csv", request.parameters.merge({:format => :csv})%> 

에 뷰에있는 링크를 변경하고 지금은 작동한다!

0

이렇게하면 안되지만 파일을 생성하고 저장하면 send_file을 사용하여 브라우저로 보낼 수 있습니다. http://api.rubyonrails.org/classes/ActionController/Streaming.html

+0

2 가지 : 나는 데이터를 즉석에서 생성하고 있는데 필자는 파일을 쓸 수 없다는 것을 확실히 알고있다 (나는 Heroku에있다). – Pierre

+2

Sendfile이 Heroku에서 작동하지 않습니다. – Slick23

0

당신은 정말 멋진 루비 DSL을 사용하여 CSV 출력을 만들 수있는 CSV 셰이퍼라고 불리는이 보석에 관심이있을 것입니다.

또한 파일 이름 사용자 지정을 허용하면서 응답 헤더 설정을 올바르게 처리합니다.

https://github.com/paulspringett/csv_shaper