目標
開発環境
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