RailsでCSVダウンロードAPIを作る

プログラミング

業務で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

以上