...

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

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

どうもおはようポテト(@ohayoupoteto22)です。

RailsでCSVファイルを取り扱いたい…

ということで今回は

CSVファイルをインポートしてそのデータを元にレコードを作成したい

CSVファイルをダウンロードできる機能を追加したい

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

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

ブログ主

早速いってみよう!

(Rails)CSVファイルをインポートしてDBに保存する方法

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メソッドでダウンロードするようにしています。

その結果…

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

 無事、ダウンロードされますね⸝⸝- ̫ -⸝⸝

お疲れ様!

ソロモン

以上になります。

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

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA