はじめに
Railsでモデル(Item)のデータを取得しcsv出力する機能を作成する
環境
ruby 2.7.2p137
Rails 6.0.3.4
コンロトーラー
app/controllers/items_controller.rb
require 'csv'
def export_csv
items = Item.all # 出力したいデータと取得します
headers = ['id', 'name']
data = CSV.generate do |csv|
csv << headers # 1行目ヘッダーになるため、項目をheadersに代入して初めにcsvに書き込みます。
items.each do |item|
csv << [item.id, item.name] # 1行目にヘッダーを書き込み終えたら、2行目以降はitemsをループ処理で書き込んでいきます。この時ヘッダーの項目と出力する値が乖離しないように同じ順番にしています。
end
end
send_data data, filename: "#{Time.now.strftime('%Y-%m-%d')}_item_list.csv"
# send_dataで作成したcsv(date)を出力します。
# ファイル名はfilenameオプションで仕様に合わせて指定する #{Time.now.strftime('%Y-%m-%d')}には今日の日付が入る。
end
ルーティング
config/routes.rb
get 'items/export_csv', to: 'items#export_csv', as: 'item_export_csv'
ビュー
viewファイルは特に用意する必要はないので、出力ボタンを配置したいviewファイルに記述していく
app/views/item/XXXXX.html.erb
<%= link_to 'CSV ダウンロード', partner_export_list_path %>
# このリンクをクリックするとitems#export_csvが実行されてCSVが出力される
データを取得してそのまま出力するだけであればこれで簡単に実装できます。