2012-05-15

railsのrespond_toでcsv

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
railsで一つのアクションでhtmlを表示したりxmlを表示させたりするときは、respond_toを使うわけですが、csvもできます。
検索すればいろいろ出てくるのですが、私はこんな感じにしてみました。
ちなみに1.8.7の場合です。

show_dataというアクションでhtmlとcsvに対応しているケースです。
csvファイルはダウンロードされて、ファイルはsjisになるようにしています。
データの取得は、Hogeモデルのget_dataでなんかしているものとしています。
html表示用のviewは別途show_data.html.erbなどが用意されているという前提です。

  def show_data
    @data = Hoge.get_data
    respond_to do |format|
      format.html
      format.csv do
        require 'fastercsv'
        csv_text = FasterCSV.generate do |csv|
          csv << ["head1","head2","head3","head4"]
          @data.each do |d|
            csv << [d[:col1],d[:col2],d[:col3],d[:col4]]
          end
        end
        send_data(csv_text.tosjis, :type => 'text/csv', :filename => "download.csv")
      end
    end
  end

viewからは以下のように呼び出します。
<%= link_to "HTML表示",:action=>"show_data" %>
<%= link_to "CSVダウンロード",:action=>"show_data",:format => :csv %>

コメントを投稿