Ruby on Railsでcsvダウンロード機能の作り方
Ruby on Railsを使ってcsvファイルのダウンロード機能を作りたくて調べました。
大枠の手順
- routesを設定
- csvを受け付けるアクションをコントローラーに設定
- 対象データを抽出しcsvフォーマットのファイルへ渡す
- CSVデータを作成する
- 画面にダウンロードボタンを作成する
コントローラーにアクションを定義する
# controller/users_controller.rb def index @users = User.all respond_to do |format| format.html format.csv do filename = ERB::Util.url_encode('ユーザー一覧.csv') send_data render_to_string, filename: filename, type: :csv end end end
ERB::Util.url_encode
は引数に渡された文字列をURLエンコードしてくれる。これによって日本語や半角スペースをよしなにしてくれる
send_data
は動的に生成されたデータをダウンロードする。
render_to_string
は表示結果を文字列として取得するメソッド。
なので、これらを組み合わせる事でCSVファイルに出力する為の文字列を作ってダウンロードを可能にしている。
参考: https://docs.ruby-lang.org/ja/latest/class/ERB=3a=3aUtil.html
参考: http://railsdoc.com/references/send_data
参考: http://railsdoc.com/references/render_to_string
View
# views/users/index.haml = link_to 'CSVダウンロード' users_path(format: :csv)
ポイントはリンクを生成するpathにフォーマット: csvを指定してあげます。これによってコントローラー側で切り分けれるようになります。
csvファイル
# views/users/index.csv.ruby require 'csv' require 'nkf' csv_data = CSV.generate do |csv| csv << %w(id 名前 年齢) @users.each do |user| csv << [ user.id, user.name, user.age ] end end NKF::nkf('--sjis -Lw', csv_data)
CSV.generate
は文字列csv形式=カンマ区切りの文字列を生成してくれます。
NKF::nkf
は文字コードを強制的に変換する為のプログラムです。