RailでCSV出力する方法
Railで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
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
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