Railsチュートリアルで作成したサンプルアプリに、特定のユーザーのマイクロポストをCSV出力する機能を拡張します。
環境
・Rails 5.1.6
・Railsチュートリアル第4版(Rails5.1) 14章まで実装済み
仕様
・ユーザーのプロフィールページのExport CSVボタンを押すと、そのユーザーのマイクロポストがCSV出力される。
完成版のイメージは以下の通りです。
実装
以下の手順で実装していきます。
Export CSVボタンを表示する
・プロフィールページにExport CSVボタンを表示
・ボタンを押したときにCSV形式でレスポンスを返すようにリクエストを投げる
CSVをレスポンスする
・リクエストを受け取り、CSVを返す
CSVを生成する
・返すCSVを生成する
Export CSVボタンを表示する
showビューにExport CSVボタンを追加します。
リクエスト先をuser_path(@user,format: :csv)
とすることで、このボタンを押したときに、csv形式でレスポンスを返すように指定したリクエストがuser_path
に送信されます。
:
:
<% if @user.microposts.any? %>
<% micropost_count = @microposts.count %>
<h3 id="micropost-count">Microposts (<%= micropost_count %>)</h3>
<%= link_to "Export CSV", user_path(@user,format: :csv),
class: "btn btn-primary btn-csv",
data: { confirm: "You are about to export #{@user.name}'s #{micropost_count} microposts.\nAre you sure you want to continue?" } %>
<ol class="microposts">
<%= render @microposts %>
</ol>
<%= will_paginate @microposts %>
<% end %>
</div>
</div>
マイクロポスト数とExport CSVボタンを横並びで表示します。
:
:
#micropost-count{
display: inline;
}
.btn-csv{
margin-left: 30px;
margin-bottom: 5px;
}
:
:
CSVをレスポンスする
ユーザーコントローラーのshowアクションに、Export CSVボタンが押されたときの処理を記述します。
respond_to do |format|
によって、リクエスト内で指定されたフォーマットごとに場合分けをします。リクエスト内で指定されたフォーマットがCSVだった場合(=Export CSVボタンが押された場合)は、CSVファイルを生成してレスポンスします。
:
:
def show
@user = User.find(params[:id])
redirect_to root_url and return unless @user.activated?
@microposts = @user.microposts.paginate(page: params[:page])
respond_to do |format| #リクエスト内容によって処理を振り分ける
format.html
format.csv do
send_data render_to_string, filename: "#{@user.name}'sMicroposts.csv", type: :csv
end
end
end
:
:
CSVを生成する
show.csv.ruby
ファイルを作成し、CSVファイルを生成する処理を記述します。
column_names
配列にマイクロポストレコードのカラム名を代入し、これを利用して、マイクロポスト一つ一つについて、カラム名に対応する値をcsvに追記します。
require 'csv'
CSV.generate do |csv|
column_names = Micropost.column_names
csv << column_names
@microposts.each do |micropost|
csv << column_names.map{ |column_name| micropost[column_name] }
end
end
以上で、特定のユーザーのマイクロポストをCSV出力する機能が完成しました。