TIS ENGINEER NOTE

27才文系出身フリーランスエンジニアのブログ

プログラミング

Ruby on RailsでCSV一覧出力する3つの方法

更新日:

ユーザーが画面に表示されている一覧情報をダウンロードしたい、という場合によく使われるのがcsv形式。

Ruby on Railsでcsv出力をしようとして、情報を集めていると色々な実装手順を見かけました。使っているライブラリなどはほとんど変わらないのですが、実装箇所が異なっているので、ちょっと混乱してしまいました。

今回は自分が調べた結果のまとめとしてRuby on Railsでcsv出力を行う際の3つのアプローチをご紹介していきます。

前提

基本的にRubyのライブラリであるCSV.generateを利用します。もっともシンプルにcsvの出力を行えます。

名前(name),説明(description),価格(price)という情報を持った製品(product)モデルのデータを表示させるとしましょう。

上記のように配列を渡していく形で、直感的に1行ずつcsv形式でデータを出力することができます。

注意しておいて欲しいのが、CSV.generate自体はcsvファイルを出力するのではなく、csv文字列を作成しているだけであるということです。上の例だとcsv_dataに入るのはStringのデータとなります。

また、これから話す手順のうち1と2はcsv出力用のviewファイルし、3はコントローラー内でcsvの作成と出力を行います。

いずれの方法も実際に動作確認済みです。

ではそれぞれの手順を見ていきましょう。

①csv出力用のアクションを作成する方法

まずは一番わかりやすいcsv出力用のアクションを作成する実装方法です。

この方法のメリット

  • わかりやすい

この方法のデメリット

  • REST設計に背く形となる

REST設計についての詳細はこちらを参考ください。

実装コード

コントローラー

一覧出力したいモデルのコントローラーにcsv出力専用のアクションを新規作成する。

ルーティング

他の基本アクションも実装する前提とすると以下の通り。collectionの中に作成したいアクションを含めます。

csv出力ファイル(ビュー)

最後に出力処理本体となるrubyファイル。link_toのパスにformat: :csvを設定すると自動で呼び出されます。なぜこの拡張子なのかは不明。

ダウンロードリンク

最後にファイル出力を行うためのリンク。できればかっこいいボタンに仕上げましょう。今回は無骨にただのリンク。ポイントはformat: :csvです。

所感

RESTにこだわる方から石を投げられそうな実装です。確かにindexで実装できそうな内容を新しくルーティングして作るというのは微妙。しかし複数のモデルにまたがる出力をしたい時などは使い所がありそうではあります。あとはどうしてもindexアクションに修正を加えたくない時とか。

②indexアクションからcsv出力ビューへ

一覧出力したいモデルのコントローラーのindexアクションから、formatを判定して、処理を分岐し、csv出力ファイルをレンダリングする形になります。csv出力ファイル(csv_output.csv.ruby)の内容は①と同様。

この方法のメリット

  • REST設計に則っている

この方法のデメリット

  • indexアクションに修正が必要

実装コード

コントローラー

respond_toで呼び出し時のformatを判定し、csvの場合、csv出力ファイルを呼び出します。それ以外の場合は通常通り、html.erbファイルが呼び出されます。

ルーティング

ルーティングに特別な設定は不要です。indexが呼び出されるルートが設定されていればOKです。

csv出力ファイル(ビュー)

①と同様のソースでOKです。

ダウンロードリンク

いつも通りのindex指定にformat: :csvを付け足すだけです。ボタンはかっこよく仕上げましょう。

所感

一番ベーシックな実装ではないかと思います。特に欠点も見当たりませんし。もしcsv処理をコントローラーに一任したい場合は③の方法をオススメします。

③indexアクションのみで実装

indexアクション内、またはメソッドを作成してその中でcsvの作成と出力を行います。

この方法のメリット

  • 処理がコントローラー内で完結する

この方法のデメリット

  • コントローラーが複雑になる可能性がある

実装コード

コントローラー

respond_toで呼び出し時のformatを判定する部分までは②と同様。ただし、csv出力ファイルをレンダリングするのではなく、別実装したメソッドにてcsv生成と出力を行います。

一旦CSV.generateを変数に格納し、send_dataでファイルを出力しています。

ルーティング

②と同様に特別なルーティングは必要ありません。

csv出力ファイル(ビュー)

csv出力ファイルを作成する必要はありません。

ダウンロードリンク

②と同様です。かっこよく仕上げましょう。

所感

csvをビューに実装するということに気持ち悪さを感じる人にはいい実装方法かと思われます。個人的にはスタイリッシュで嫌いではないです。

おまけ

文字コードを指定したい

CSV.generateにオプションを指定するだけでOKです。①の実装例で試すとこんな感じ。

タイトルや空白行を出力したい

以下の通りの実装で行けます。渡す値が配列であれば問題ありません。こちらも①の実装例で。

出力されるファイルは以下のようになります。

まとめ

いかがだったでしょうか。あなた自身や開発現場のコーディング方針に適した手法を選択していただければ。

閲覧いただき、ありがとうございました。

よく読まれている記事

エンジニア入門

2018/8/22

現役プログラマがオススメするプログラミングスクール3選

こんにちは、フリーエンジニアのてぃすです。 最近はエンジニアの人手不足による給与向上や、自由度の高い働き方に魅力を感じてエンジニア・プログラマを目指す人が増えてきました。 僕の周囲にもプログラミングを始めたいという人が増えてきて、プログラミングスクールとかたくさんあるけどどれがいいの?という質問を受けることがあります。 せっかくなので実際に現場でWeb開発に携わる立場からプログラミングスクールについて比較しながら調べてみました。 そして実際にエンジニアとして働くために最も充実したサービスを提供しているプロ ...

続きを読む

エンジニア独立

2018/9/2

プログラマーがフリーランスになって独立するために必要なスキル

こんにちは、フリーエンジニアのてぃすです。 ITエンジニアが独立するべきか、しないべきか。昨今のエンジニア・プログラマーの働き方議論において、最もホットなのがこの話題じゃないでしょうか。 賛否については、それぞれの立場や環境によって感情論も混ざって言い分は異なりますし、経験したこともない人の否定意見も飛び交って魑魅魍魎が跳梁跋扈な感じです。 なので今回はそういった賛否ではなく、実際にプログラマーをはじめとするITエンジニアが独立するためにはどの程度のスキル・経歴が必要かについてお話していこうと思います。 ...

続きを読む

エンジニア入門

2018/8/19

プログラミング初心者に贈る挫折しない為の3つの心構え

こんにちは、フリーエンジニアのてぃすです。 最近では未経験者からプログラマー・エンジニアへの転身を志しプログラミングを学習を始めている人が増えていますね。 しかし理解出来ない部分が出てきたり、モチベーションを保てずに学習途中で挫折していまうという話も多く耳に入ってきます。 そこで今回は文系出身から職業プログラマーへ進んだ僕が、挫折しないプログラミング学習の進め方・心構えについてお話していこうと思います。 目的が具体的にイメージできる教材を使用する プログラミングの学習を始めて間もないときに、 変数に値を代 ...

続きを読む

エンジニア独立

2018/8/19

エンジニアがリモートワークをして感動したお話

こんにちは。フリーランスエンジニアのてぃすです。 僕はエンジニアとして活動する中で、メインで参加しているプロジェクト以外にもフルリモートでもう1つのプロジェクトにも参加しています。 今日は実際にリモートワークってどんなもんなのかについてお話していこうと思います。 前置き リモートワークの話題については各種メディア、ブログやSNSでも度々盛り上がっています。 通勤時間の短縮になる 通勤で使う体力を仕事にまわすことができる 家庭の事情などで外で働けない人も活躍することができる などのポジティブな捉え方もあれば ...

続きを読む

エンジニア独立

2018/8/22

【厳選】現役フリーエンジニアが勧めるフリーランスエージェント2選

こんにちは、フリーエンジニアのてぃすです。 エンジニア、特にプログラマーがフリーランスになろうとしたとき、人脈豊富なスーパーエンジニアでもない限り、最も現実的な選択肢がフリーランスエージェントを利用した働き方です。 とはいえエンジニアバブルの昨今、そういったエージェントサービスは数多存在しており、戦国時代状態です。 選択肢が多いということは嬉しいことであり、同時にどれを選べばいいかという悩みにもなります。 各サイトではメリットや自サービスの長所しか書かれていません。当然ですが。 そうなると選ぶ側としては迷 ...

続きを読む

-プログラミング
-,

Copyright© TIS ENGINEER NOTE , 2018 All Rights Reserved Powered by AFFINGER5.