2011-01-03 9 views
14

私はユーザにテーブルをCSVにエクスポートできるようにしたいと思います。Rails - 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ファイルの内容を表示します。

私は多くを読んだが、うまくいくものは見つかりませんでした。 アイデアはありますか?

ありがとう、p。

+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

送信ファイルがHerokuで動作しません。 – Slick23

0

本当に素敵なRuby DSLを使ってCSV出力を作成できるCSVシェイパーと呼ばれるこの宝石に興味があるかもしれません。

また、ファイル名のカスタマイズを許可しながら、応答ヘッダーの設定も正しく処理されます。

https://github.com/paulspringett/csv_shaper

関連する問題