【Rails6】CSV出力の方法【最新版】

Ruby on Rails

はじめに

この記事の概要

Railsのアプリケーションを使っていて、CSV出力が必要な時が数多くあると思います。
そこで今回は今現在私が実際に使っているCSV出力の方法を説明します!
「rails csv出力」と調べても色々実装方法が出てしまって悩んでいる人は参考にしてください😎

ツキヤ

僕が実際に使っている方法ですので、ぜひ最後まで見ていってください!

対象読者

  • Rails6でのCSV出力がわからない人

筆者の環境

技術バージョン
実行環境docker (ubuntu20.04)
ruby2.7.4
Rails6.1.4

実装

CSV機能のインストール

まずは下ごしらえとして、config/application.rbに追記をします!

require "rails"
# Pick the frameworks you want:
require "active_model/railtie"
require "active_job/railtie"
require "active_record/railtie"
require "active_storage/engine"
require "action_controller/railtie"
require "action_mailer/railtie"
require "action_mailbox/engine"
require "action_text/engine"
require "action_view/railtie"
require "sprockets/railtie"

require 'csv'

# -- 以下略 --

14行目のrequire ‘csv’を追加するだけでCSVに関する準備は完了です!
(13行目までは人それぞれ違うと思います)

注意
他の記事で色々requireをしているものを見かけますが、rails6でCSVを扱いたい場合はこの1行の記述のみでOKです!
またはCSVの記述を使用するファイルそのものにrequireを記述するのでも問題無いです!

コントローラでの実装

今回は一例としてuserモデルの名前とメールアドレスをCSV出力してみましょう💪
今回は簡単化のためにindex, show等をはじめとしたCRUD以外にcsv_outputというメソッドを用意してあげます。

# 中略 ~~~

def csv_output
  @users = User.all
  csv_data = CSV.generate do |csv|
    csv << ["ユーザー名", "メールアドレス"]
    @users.each do |user|
      csv << [user.name, user.email]
    end
   end
  send_data(csv_data, filename: "ユーザー一覧.csv")
  redirect_back(fallback_location: root_path)
end

# 以下略 ~~~

1つのブロックごとに順番に説明していきます。

1

@users = User.all

まずはいつも行っているように@usersに全部格納します。
この@usersに格納したレコードを出力します。

ツキヤ

この時に@user = User.where(name: “田中”)のように絞り込みしてあげれば、その結果のみでCSV出力することが可能です😎

2

csv_data = CSV.generate do |csv|
  csv << ["ユーザー名", "メールアドレス"]
  @users.each do |user|
    csv << [user.name, user.email]
  end
end

このブロックで実際にcsv_dataにcsvにしたい配列を代入していきます。
CSV.generate do |csv|でCSVの機能を使うことになります。

注意
このCSVの機能は先程のconfig/application.rbの追記をしておかないと機能しません!

<<という記号はcsvに右辺の配列を追加することになります!
ですので、6行目が終わった時点ではcsvの中身は[“ユーザー名”, “メールアドレス”]というただの1次元配列ですね。
次に、7~9行目でeach文を回すことで全てのユーザーの名前とメールアドレスをcsvに格納していくことになります。
つまり、[[“ユーザー名”, “メールアドレス”], [“田中太郎”, “tanaka@example.com”], [“佐藤二朗”, “satou@example.com”], [“山田ツキヤ”, “yamada@example.com”]]のように追加されていきます!
最後のendが終わったタイミングでcsvの中身がcsv_dataに代入されます!

3

send_data(csv_data, filename: "ユーザー一覧.csv")

これで作成したcsv_dataを実際に出力して手元のパソコンにダウンロードします。

ツキヤ

filename:には好きな名前を代入可能です!

4

redirect_back(fallback_location: root_path)

これでもともとのパスに戻してあげます。(indexからこの関数にとんできたら、トップページに戻ります)

以上でCSV出力は完了です、お疲れ様でした🥳

補足

実際には、コントローラは薄くしたほうが良いので、これらの記述は全てモデルに寄せてあげた方が熟練者っぽくなります😎
具体的には、

# 中略 ~~~

def csv_output
  @users = User.all
  send_data(User.csv_output(@users), filename: "ユーザー一覧.csv")
  redirect_back(fallback_location: root_path)
end

# 以下略 ~~~
class User < ApplicationRecord
# 中略

def self.csv_output(users)
  CSV.generate do |csv|
    csv << ["ユーザー名", "メールアドレス"]
    users.each do |user|
      csv << [user.name, user.email]
    end
  end
end

# 中略
end

上記のようにクラスメソッドとしてuser.rbにメソッドを用意してあげればコントローラがスッキリしますね💪
慣れてきた人はこちらの記述にして熟練者に近づきましょう🔥

終わりに

今回はCSVの出力方法と、補足としてスキニーコントローラにするための一例を説明しました!
Railsの勉強をしたい方はこの本が参考になるかと思いますので興味がある方は是非読んで見て下さい🙇‍♂️
これを参考にして皆さんも良いRailsライフを送って下さい!!