LoginSignup
20
26

More than 3 years have passed since last update.

【Ruby on Rails】CSV出力機能

Last updated at Posted at 2020-09-20

目標

CSV.gif

開発環境

ruby 2.5.7
Rails 5.2.4.3
OS: macOS Catalina

前提

※ ▶◯◯ を選択すると、説明等が出てきますので、
  よくわからない場合の参考にしていただければと思います。

postモデルにはtitle,bodyのカラムがあり、
userモデルとはN:1の関係です。

まずは完成形のコードを記述し、その後補足コードを記述します

完成コード

controllerの編集

app/controllers/posts_controller.rb
class PostsController < ApplicationController
  require 'csv'

  def new
    @post = Post.new
    @posts = Post.all
    respond_to do |format|
      format.html
      format.csv do |csv|
        send_posts_csv(@posts)
      end
    end
  end

  private
  def send_posts_csv(posts)
    csv_data = CSV.generate do |csv|
      column_names = %w(投稿者名 タイトル 本文)
      csv << column_names
      posts.each do |post|
        column_values = [
          post.user.name,
          post.title,
          post.body,
        ]
        csv << column_values
      end
    end
    send_data(csv_data, filename: "投稿一覧.csv")
  end
end

view

app/views/posts/new.html.erb
<%= link_to "csvで出力する",new_post_path(format: :csv) %>

補足コード

controller

app/controllers/posts_controller.rb
class PostsController < ApplicationController
  require 'csv' # ←忘れがちのため要注意

  def new
    @post = Post.new
    @posts = Post.all
    # respond_to はリクエストに応じた処理を行うメソッドです。
    # 通常時はhtmlをリクエストしているので、処理は記述していません。
    # viewのlink_toでformatをcsvとして指定しているので、
    # リンクを押すとsend_posts_csv(@posts)の処理を行います。
    respond_to do |format|
      format.html
      format.csv do |csv|
        send_posts_csv(@posts)
      end
    end
  end

  private
  def send_posts_csv(posts)
    # CSV.generateとは、対象データを自動的にCSV形式に変換してくれるCSVライブラリの一種
    csv_data = CSV.generate do |csv|
      # %w()は、空白で区切って配列を返します
      column_names = %w(投稿者名 タイトル 本文)
      # csv << column_namesは表の列に入る名前を定義します。
      csv << column_names
      # column_valuesに代入するカラム値を定義します。
      posts.each do |post|
        column_values = [
          post.user.name,
          post.title,
          post.body,
                ]
      # csv << column_valueshは表の行に入る値を定義します。
        csv << column_values
      end
    end
    # csv出力のファイル名を定義します。
    send_data(csv_data, filename: "投稿一覧.csv")
  end
end

view

app/views/posts/new.html.erb
<!-- formatをcsvとして指定してcontrollerのrespond_toの処理を実行する -->
<%= link_to "csvで出力する",new_post_path(format: :csv) %>

P.S.

TwitterではQiitaにはアップしていない技術や考え方もアップしていますので、
よければフォローして頂けると嬉しいです。
詳しくはこちら https://twitter.com/japwork

20
26
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
20
26