はじめに
この記事の概要
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行目までは人それぞれ違うと思います)
または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つのブロックごとに順番に説明していきます。
@users = User.all
まずはいつも行っているように@usersに全部格納します。
この@usersに格納したレコードを出力します。
ツキヤ
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を実際に出力して手元のパソコンにダウンロードします。
ツキヤ
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ライフを送って下さい!!