目的
- Qiitaの記事に大まかな流れをテンプレート化しておき、作業効率を上げる。
- 今までの実装では
send_data
しか使ったことなかったのでメモ
前提条件
- ruby 2.6.0
- ruby 5.2.2
手順
- routes.rbにCSVダウンロード用のルーティングを設定する
- コントローラーに変数を定義、その他諸々を設定
- 出力データを作成(アクション名.csv.ruby)
- CSVダウンロードボタンを設定したいviewファイルに書く
※コード内容は適当
1. routes.rbにCSVダウンロード用のルーティングを設定する
config/routes.rb
resources :card_infos do
collection do
# デフォルト形式をcsvに設定
get :csv_download, defaults: { format: 'csv' }
end
end
Helper | HTTP Verb | Path | Controller#Action |
---|---|---|---|
csv_download_card_infos_path | GET | /card_infos/csv_download(.:format) | card_infos#csv_download {:format=>"csv"} |
2. コントローラーに変数を定義やその他諸々を設定
app/controllers/card_infos_controller.rb
class CardInfosController < ApplicationController
def csv_download
@cards = CardInfo.all
# CSVダウンロードファイルのヘッダーを生成する
create_csv_file_header("card_info_#{ Time.zone.now.strftime('%Y%m%d') }")
end
end
共通化メソッド
# CSVダウンロードファイルのヘッダーを生成する
def create_csv_file_header(file_name)
file_name = ERB::Util.url_encode(file_name) if (/MSIE/ =~ request.user_agent) || (/Trident/ =~ request.user_agent)
headers['Content-Disposition'] = "attachment; filename=\"#{file_name}.csv\""
end
3. 出力データを作成(アクション名.csv.ruby)
※viewディレクトリ配下に設置する
app/views/card_infos/csv_download.csv.ruby
require 'csv'
columns = %w(
番号
会社
子会社
カード種類
カード会社
管理区分
)
# encoding等のoptionは仕様によって変えてください
CSV.generate(encoding: Encoding::SJIS, row_sep: "\r\n", force_quotes: true) do |csv|
csv << columns
@cards.each_with_index do |card, number|
csv << [
number + 1,
card.company.parent_company.company_name,
card.company.company_name,
card.card_type.card_type_i18n,
card.card_type.card_company.card_company_name,
card.management_type_i18n,
]
end
end
4. CSVダウンロードボタンを設定したいviewファイルに書く
(例)app/views/card_infos/index.html.erb
<%= link_to csv_download_card_infos_path, class: "btn_blue btn_big csv_dl", download:"", style: "padding: 8px 25px; font-family: Arial;" ) do %>
<i><img src="<%= asset_path 'icon_download.svg' %>" alt="CSVダウンロード"></i>CSVダウンロード
<% end %>
📂🌲変更するファイル
.
├── app
| ├── controllers
| | |
| | └── card_infos_controller.rb ②アクションを設定
| |
| |
| |
| └── views
| |
| └── card_infos
| |
| └── csv_download.csv.ruby ③出力ファイルを設定
|
|
├── config
| |
└── routes.rb ①ルーティングを設定
④ViewファイルにCSVダウンロードボタンを設置
関連URL
[send_dataでの日本語ファイル名文字化け対策(IE11対応)]
(https://qiita.com/hi-nakamura/items/ed48a17f86051c2d0061)
【簡単3ステップ】RailsでCSV出力する方法