LoginSignup
80
67

More than 5 years have passed since last update.

【簡単3ステップ】RailsでCSV出力する方法

Last updated at Posted at 2018-07-03

はじめに

そもそもCSVって何?という状態でしたが、CSV出力の実装をすることになったので、備忘録として残しておきます。

【バージョン】
rails 4.2
ruby 2.3.6

やることをざっくり説明してみる

Railsのフレームワークとして、Model, View, colotrollerとありますが、実際にいじるのはviewとcontrollerです。

view => csvファイルを作成 ・ 出力ボタンの設置
controller => csvとして出力するオブジェクトを投げる ・ ファイル名を設定

やることとしてはこんな感じです。
それでは順を追って説明していきます。

CSVファイルの作成(View)

CSVとして出力するためのファイルを作成します。
拡張子は、xxxxxxxxx.csv.rubyというようにしておきましょう。

app/view/uses/index.csv.ruby
require 'csv'

CSV.generate do |csv|
  column_names = %w(name age Email)
  csv << column_names
  @users.each do |user|
    column_values = [
      user.name,
      user.age,
      user.email
    ]
    csv << column_values
  end
end

※補足 %w()は、空白で区切って配列を返すので長くなった時はわざわざ(,)をうち忘れる心配もなく便利です。

csv << column_names で表の列に入る名前を定義します。
csv << column_values で表の行に入る値を定義します。

CSV出力ボタンを設置する(View)

app/view/users/index.html.erb
  <%= link_to "CSV", users_path(format: :csv), class: "btn btn-primary" %>

これでどのアクションに対してcsvを出力するかを指定します。
ここでは、users_path => usersコントローラのindexアクションになるので(普通なら)、indexアクションを実行することになります。
また、request_urlとして現在のurlを指定することもできます。

フォーマットごとに出力内容を指定(Controller)

app/controllers/users_controller.rb
class UsersController < ApplicationController
  def index
    @users = User.all
    respond_to do |format|
      format.html do
          #html用の処理を書く
      end 
      format.csv do
          #csv用の処理を書く
      endw
    end
  end
end

formatごとに違う処理をしたいというわけでなければ、format の部分は無視してOKです。

もしファイル名を変更したいとなった場合は, format.csv do の後に続いて、以下の様に記述します。

send_data render_to_string, filename: "(ファイル名).csv", type: :csv

おわりに

こちらの記事が超シンプルでわかりやすかったので非常に参考になりましたm(_ _)m
https://qiita.com/necojackarc/items/39e0f0c438363f7084db

こんなに簡単にできるとは思ってなかったので、記事で説明してくれた皆さんに感謝です。

80
67
1

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
80
67