LoginSignup
11
15

More than 5 years have passed since last update.

Ruby on RailsでモデルをCSV出力させる

Posted at

Railsで社内システム系のWEBアプリケーションを作りました。コマンドを扱えない利用者でもデータをいつでも可視化できるようにExcelなどのおなじみのUIで閲覧できたら良いなと思い、CSV出力を試みたので、方法をを紹介します。

①CSVの出力は結構簡単

私も実は「Gemとか、configとか色々大変なんだろうな」と考えていました。しかしコントローラーで特別な処理を書く必要はありません。普段HTMLでしているように、csvはビューとして扱います。Formatが.csvに変わっただけです。Railsおそるべし。

コントローラ

まず、コントローラーではHTMLに出力するのと同じように記載すれば基本的にOKです。

app/controllers/admin_controller.rb
def users_to_csv
  @users = User.all
end

ルーティング

config/routes.rb
'admin/users.csv' => 'submit#users_to_csv'

ここまでは、DBをサーバーからビューで閲覧・操作させるときと変わりません。
特別な操作(それほど特別でもありませんが)はビューにやらせればOKです。

ビュー

拡張子は.csv.rbではなく.csv.rubyでファイルを記述してください。
(リテラルを使うとより効率的にコードが書けます。)
リテラルまとめ

users_to_csv.csv.ruby
require 'csv'

CSV.generate do |csv|
  csv_column_names = %w(氏名 アドレス 番号 ステータス)
     #%w(氏名 アドレス)はrubyのリテラルの一つで、["氏名","アドレス"]と同値になります。

  csv << csv_column_names
  @users.each do |mic|
    csv_column_values = [
      user.name
      user.email
      user.tel
      user.status
    ]
    csv << csv_column_values
  end
end

②ハマりやすい点

linkを指定する際に、format: :csvの指定が必要です!ネットに乗っているドキュメントをみる限り、かなり詳細に記載してくれているので、エラーが出る場合ここが最多なんじゃないかなと。

CSV出力のためのリンクは以下のように指定しましょう。

<%= link_to('CSVをダウンロード','/admin/users.csv',{format: :csv}) %>

これで、PC用のブラウザでCSVファイルがダウンロードができます。UTF-8を指定している場合Excelで表示すると文字化けすることがあります。その対処方法に関しては次のリンクを参照してください。
http://global-wing.com/activity/csv_character_code.html

11
15
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
11
15