Web制作メモ -トップへ-

RailsでCSVのエクスポート

Ruby2016.02.07 19:45

CSVのエクスポート機能を実装しました。

(1) モデルクラスにクラスメソッドto_csvを定義

・app/models/admin/topic.rb

require 'csv'
class Admin::Topic < ActiveRecord::Base
  def self.to_csv
    csv_data = CSV.generate("", {:row_sep => "\r\n", :force_quotes => true}) do |csv|
      csv << self.first.attributes.keys
      self.all.each do |model|
        csv << model.attributes.values
      end
    end
    csv_data.encode(Encoding::SJIS)
  end
end

(2) コントローラーアクセスが来たらモデルからデータを取り出し、(1)で定義したto_csvメソッドを呼び出す。上手くダウンロードされない場合はformat.anyを使う。

app/controllers/admin/topics_controller.rb

class Admin::TopicsController < ApplicationController
  def export
    respond_to do |format|
      format.csv { send_data Admin::Topic.to_csv,
        filename: Admin::Topic.model_name.plural + '-' + Time.now.strftime("%Y-%m%d-%H%M") + ".csv" }
    end
  end
end

(3) (2)でrespond_toがcsvを認識しない場合はroutes.rbにformat: "csv"を入れる

・config/routes.rb

namespace :admin do
  collection { get "export", path: "export", format: "csv" }
end

(4) ダウンロードボタンを作成する

app/views/admin/template/show.html.erb

<%= link_to "CSVエクスポート", ("export_" + @records.model_name.plural).to_sym, class: "btn-01" %>