
【Rails6】CSV出力の方法【最新版】
はじめに
この記事の概要
Railsで開発をしていて、CSV出力が必要な時が数多くあると思います。
そこで今回は今現在私が実際に使っているCSV出力の方法を説明します!
「Rails csv出力」と調べても色々実装方法が出てしまって悩んでいる人は参考にしてください😎
僕が実際に使っている方法ですので、ぜひ最後まで見ていってください!
対象読者
- Rails6でのCSV出力方法が分からない人
筆者の環境
| 技術 | バージョン |
|---|---|
| 実行環境 | Docker (ubuntu20.04) |
| Ruby | 2.7.4 |
| Rails | 6.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行目までは人それぞれ違うと思います)
コントローラでの実装
今回は一例として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つのブロックごとに順番に説明していきます。
データの取得
@users = User.allまずはいつも行っているように@usersに全部格納します。
この@usersに格納したレコードを出力します。
この時に@user = User.where(name: "田中")のように絞り込みしてあげれば、その結果のみでCSV出力することが可能です😎
CSV形式への変換
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に右辺の配列を追加することになります!
ですので、6行目が終わった時点ではcsvの中身は["ユーザー名", "メールアドレス"]というただの1次元配列ですね。
次に、7~9行目でeach文を回すことで全てのユーザーの名前とメールアドレスをcsvに格納していくことになります。
つまり、[["ユーザー名", "メールアドレス"], ["田中太郎", "tanaka@example.com"], ["佐藤二朗", "satou@example.com"], ["山田ツキヤ", "yamada@example.com"]]のように追加されていきます!
最後のendが終わったタイミングでcsvの中身がcsv_dataに代入されます!
ファイルのダウンロード
send_data(csv_data, filename: "ユーザー一覧.csv")これで作成したcsv_dataを実際に出力して手元のパソコンにダウンロードします。
filename:には好きな名前を代入可能です!
リダイレクト処理
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ライフを送ってください!!

