Ruby on Rails

【CSV.generate】RailsでCSVファイルを出力する方法

2020年7月3日

Railsで簡単にCSVファイルを出力する方法

Ruby on RailsのCSV出力のライブラリである「CSV.generate」を使用し、CSVファイルを出力する方法を紹介します。

スポンサーリンク

本記事では、次のような一覧画面に「CSV出力」ボタンを配置して、「CSV出力」ボタンを押下するとCSVファイルをダウンロードする処理を実装しています。

[例:一覧画面イメージ]

一覧画面のイメージ例

 

[例:CSVファイル]

CSVファイルの出力例

 

それでは、実際にソースコードを書いてみましょう。

Controller (コントローラー)

[app/controllers/users_controller.rb]

require 'csv'

class UsersController < ApplicationController

  # GET /users
  # GET /users.json
  def index
    @users = User.all

    respond_to do |format|
      format.html
      format.csv do |csv|
        send_users_csv(@users)
      end
    end
  end

  def send_users_csv(users)
    csv_data = CSV.generate(row_sep: "\r\n", encoding:Encoding::CP932)  do |csv|
      header = %w(名前 住所 電話番号 性別 メールアドレス メール受信)
      csv << header

      users.each do |user|
        values = [user.name,user.address,user.phone,user.sex,user.mail_address,user.email_permission]
        csv << values
      end

    end
    send_data(csv_data, filename: "users.csv")
  end

end

 

まず「respond_to」を利用して「format」に「csv」が指定された場合は、「send_users_csv」メソッドを呼び出し、

respond_to do |format|
  format.html
  format.csv do |csv|
    send_users_csv(@users)
  end
end

 

「send_users_csv」メソッド内では「CSV.generate」を利用してCSVファイルのヘッダ部とデータ部を生成しています。

※今回の例では、文字コード「MS932(Shift_JIS)」、改行コード「CRLF」を指定。

csv_data = CSV.generate(row_sep: "\r\n", encoding:Encoding::CP932)  do |csv|
  header = %w(名前 住所 電話番号 性別 メールアドレス メール受信)
  csv << header

  users.each do |user|
    values = [user.name,user.address,user.phone,user.sex,user.mail_address,user.email_permission]
    csv << values
  end
end

View(ビュー)

viewには、以下のボタンを設置するだけです。

<%= link_to "CSV出力",users_path(format: :csv) %>

 

これで完成です。

設置したボタンを押下すれば、CSVファイルがダウンロードされます。

helpful