技術ブログ

(技術系中心)基本自分用備忘録なので、あくまで参考程度でお願いします。

RailでCSV出力する方法

RailでCSV出力する方法

RubyCSVを利用すれば簡単にCSV出力が可能です。

環境

ruby 2.6.3 Rails 6.0.0

View

# ポイントは引数にformat: :csvを指定することです。
# これでcsv形式でのリクエストを送ることができます。
<%= link_to "csvで出力する",hoges_path(format: :csv) %>

Controller

# CSVクラスを利用するためにrequireは必要になります。
# https://docs.ruby-lang.org/ja/2.0.0/class/CSV.html
require 'csv'

class HogesController < ApplicationController
  def index
    @hoges = Post.all

    # respond_toでリクエストに応じて出力のフォーマットを分けるように実装します。
    # view側のlink_toの引数にformat: :csvを指定しているので。
    # リクエストはcsv形式である筈なので、format.csvの処理が行われます。
    respond_to do |format|
      format.html
      format.csv do |_csv|
        # send_dataヘルパーでダウンロード機能を実装しています。
        csv_data = HogeService.send_posts_csv(@hoges)
        send_data(csv_data, filename: "accounts #{Time.zone.today}.csv")
      end
    end
  end
end

■send_dataヘルパー https://railsguides.jp/action_controller_overview.html#%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%A8%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89

Serviceクラス

CSVの吐き出しのロジックはServiceクラスに切り分けました。(コントローラークラスに記載してもOK)

class HogeService< ApplicationRecord

  def self.send_posts_csv(hoges)
    # CSV.generateを利用するとCSV 形式で文字列を構築する事が出来ます。
    CSV.generate do |csv|
      header = %w[id name]
      csv << header

      hoges.each do |hoge|
        values = [hoge.id, hoge.name]
        csv << values
      end
    end
  end
end

例) RubyでのCSV使い方サンプル

require 'CSV'
  
headers = ["language","greeting"]
rows = [["English","Hi"], ["Japanese", "こんにちは"]]
csv_data = CSV.generate() do |csv|
  csv << headers
  rows.each do |row|
    csv << row
  end
end
p csv_data

実行結果

"language,greeting\nEnglish,Hi\nJapanese,こんにちは\n"

まとめ

CSVクラスを利用すれば出力だけではなく、読み込みや書き込みなど様々な実装が可能です。 https://docs.ruby-lang.org/ja/2.0.0/class/CSV.html