業務でCSVダウンロードAPIを作成する機会があったのでその際のメモです
同じような機能を実装する方の参考になれば幸いです
今回はユーザー情報の一覧をCSVでダウンロードする想定で書いていきます
ルーティング
ルーティングは/users/download_csvとします
# config/routes.rb
Rails.application.routes.draw do
resources :users do
collection do
get :download_csv
end
end
end
コントローラー
実装はシンプルで以下の流れになります
1. generate_csvメソッドでCSVを作成
2. send_dataでバイナリデータを返します
require 'csv'
def csv_download
users = User.all
csv_data = generate_csv(users)
send_data csv_data, filename: "users-#{Time.zone.today}.csv", type: 'text/csv'
end
private
# CSVファイルを生成するメソッド
def generate_csv(users)
CSV.generate(headers: true) do |csv|
csv << ["ID", "Name", "Email"]
users.each do |user|
csv << [
user.id,
user.name,
user.email
]
end
end
end
注意点としてはRailsをAPIモードで作成している場合
send_dataをrespond_toで実装するとNoMethodErrorになります
respond_toを使用したい場合はApplicationControllerにMimeResopndsをincludeする必要があります
class ApplicationController < ActionController::API
include ActionController::MimeResponds
end
以上