くるみ
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メソッドでダウンロードするようにしています。
その結果…
ボタンをクリックすると…
無事、ダウンロードされてますね。
お疲れ様!
くるみ
まとめ
参考になれば幸いです!では⸝⸝- ̫ -⸝⸝