【Rails】CSVのインポート・ダウンロード機能を実装する方法

RailsでCSVファイルをインポートしてDBに保存&ダウンロード機能を追加する方法

くるみ

RailsでCSVファイルを取り扱いたい…
ということで今回は

  • CSVファイルをインポートしてそのデータを元にレコードを作成したい
  • CSVファイルをダウンロードできる機能を追加したい

という方に向けてRailsで「CSVファイルをインポートしてDBに保存する方法」と「CSVファイルをダウンロード機能を追加する方法」とまとめました。

初学者の備忘録ゆえに至らない点もあると思いますが参考になれば幸いです⸝⸝- ̫ -⸝⸝

RailsでCSVのインポート機能を実装する方法

gemをインストール

gem 'roo'
$ bundle install

まずCSVファイルを読み込むために「roo」というgemをインストールします。

ルーティング

resources :users do
  collection {post :create_students}
end

次にルーティングをいじります。

collectionブロックを使って自前のアクションを追加します。

次はこのcreate_studentsというアクションの中身を書いてくよ

くるみ

コントローラー

氏名学年メールアドレス
CSV 太郎1〇〇〇
CSV 加奈3△△

今回はこのような形式のCSVファイルをインポートして、それを基に一人の生徒を作成し保存します。

require "csv"

def create_students
  file=params[:file] #受け取ったCSVファイル
  CSV.foreach(file.path, headers: true) do |row|
    #一行ずつ取り出し生徒を作成
    user=User.new(
      name: row["氏名"],
      grade: row["学年"].to_i,
      email: row["メールアドレス"]
    )
    if user.save
      flash[:notice]="生徒を追加できました"
    else
      flash[:alert]="生徒を追加できませんでした"
    end
  end
end

やってることを簡潔にまとめると

  • csvライプラリを追加
  • 「headers: true」で一行目をヘッダーとし、それをキーとし値を取得
  • CSVファイルを一行ずつ取り出しそれを元に生徒を作成

こんな感じ。

ビュー

<%=form_tag "/admin/users/create_multi",multipart: true do%>
  <%= file_field_tag :file ,accept:"text/csv" %>
  <%= submit_tag "インポートする"%>
<%end%>

ビューはこんな感じ。

multipart: true」と指定することでファイルをアップロードできるようにしています。

ブログ主

form_forは省略してもいいけどform_tagはダメみたい

その結果…


「追加する」をクリックすると…


無事、生徒が一括追加されました⸝⸝- ̫ -⸝⸝

やったー!しゃんなろー!

くるみ

次はダウンロード機能についてです。

RailsでCSVをダウンロードする機能を追加する

「クリックすると事前にこちら側で用意していたCSVファイルがダウンロードされるボタン」を作っていきます。

ビュー

<%=link_to "/admin/users/download_csv" do%>
  <button type="button">テンプレートをダウンロードする</button>
<%end%>

まずボタンを設置。

コントローラー

def download_csv #CSVファイルのダウンロード
  filepath = Rails.root.join("app", "assets", "csvs" ,"△△.csv")
  stat = File::stat(filepath)
  send_file(filepath, filename:'〇〇.csv',type: "text/csv")
end

自分は/app/assets/csvsにCSVファイルを置いておいたので、filepathに入れるURLはこんな感じに。

そしてsendfileメソッドでダウンロードするようにしています。

 

その結果…


ボタンをクリックすると…


無事、ダウンロードされてますね。

お疲れ様!

くるみ

まとめ

以上、RailsでCSVのインポート・ダウンロード機能を実装する方法でした。

参考になれば幸いです!では⸝⸝- ̫ -⸝⸝

コメントを残す