LoginSignup
1
0

More than 5 years have passed since last update.

RailsチュートリアルのサンプルアプリにCSV出力機能を拡張

Last updated at Posted at 2019-04-06

Railsチュートリアルで作成したサンプルアプリに、特定のユーザーのマイクロポストをCSV出力する機能を拡張します。

環境

・Rails 5.1.6
・Railsチュートリアル第4版(Rails5.1) 14章まで実装済み

仕様

・ユーザーのプロフィールページのExport CSVボタンを押すと、そのユーザーのマイクロポストがCSV出力される。

完成版のイメージは以下の通りです。

・Export CSVボタンを追加
スクリーンショット 2019-04-06 9.25.41.png

・出力されたCSV
CSV.png

実装

以下の手順で実装していきます。

Export CSVボタンを表示する
・プロフィールページにExport CSVボタンを表示
・ボタンを押したときにCSV形式でレスポンスを返すようにリクエストを投げる

CSVをレスポンスする
・リクエストを受け取り、CSVを返す

CSVを生成する
・返すCSVを生成する

Export CSVボタンを表示する

showビューにExport CSVボタンを追加します。
リクエスト先をuser_path(@user,format: :csv)とすることで、このボタンを押したときに、csv形式でレスポンスを返すように指定したリクエストがuser_pathに送信されます。

/sample_app/app/views/users/show.html.erb
:
:
  <% 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ボタンを横並びで表示します。

/sample_app/app/assets/stylesheets/custom.scss
:
:
#micropost-count{
  display: inline;
}
.btn-csv{
  margin-left: 30px;
  margin-bottom: 5px;
}
:
:

CSVをレスポンスする

ユーザーコントローラーのshowアクションに、Export CSVボタンが押されたときの処理を記述します。
respond_to do |format|によって、リクエスト内で指定されたフォーマットごとに場合分けをします。リクエスト内で指定されたフォーマットがCSVだった場合(=Export CSVボタンが押された場合)は、CSVファイルを生成してレスポンスします。

/sample_app/app/controllers/users_controller.rb
:
:
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に追記します。

/sample_app/app/views/users/show.csv.ruby
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出力する機能が完成しました。

参考

【簡単3ステップ】RailsでCSV出力する方法
RailsでMVCを意識してシンプルにCSV出力

1
0
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
1
0