LoginSignup
2
1

More than 3 years have passed since last update.

ルーティングを設定してCSVデータのダウンロード(出力)を実装する方法

Last updated at Posted at 2020-02-14

目的

  • Qiitaの記事に大まかな流れをテンプレート化しておき、作業効率を上げる。
  • 今までの実装では send_data しか使ったことなかったのでメモ

前提条件

  • ruby 2.6.0
  • ruby 5.2.2

手順

  1. routes.rbにCSVダウンロード用のルーティングを設定する
  2. コントローラーに変数を定義、その他諸々を設定
  3. 出力データを作成(アクション名.csv.ruby)
  4. 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対応)
【簡単3ステップ】RailsでCSV出力する方法

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1