CSVファイルの取り込みはできたのですが、CSVファイルのみを指定する挙動のコードの部分で躓いてしまったため、記事に残したいと思います。
まずはviewです。ここではファイルのimportに関するボタンを作成しています。
index.html.erb
<div class="col-md-10 col-md-offset-1">
<%= form_tag import_users_path(format: :csv), multipart: true do %>
<%= file_field_tag :file, class: "btn btn-default" %>
<%= submit_tag "CSVをインポート", class: "btn btn-md btn-primary btn-width" %>
<% end %>
</div>
次にusers_controllerに次の記述を行いました。
ここでファイルの末尾に".csv"と入っているファイルとそれ以外の挙動を書きます。
def import
if File.extname(params[:file].original_filename) == ".csv"
flash[:success] = 'CSVファイルを読み込みました'
User.import(params[:file])
redirect_to users_url
else
flash[:danger] = 'CSVファイルを選択してください'
@users = User.all
redirect_to users_url
end
end
次にuser.rbモデルでimportをしたcsvファイルについての処理を記述します。
def self.import(file)
CSV.foreach(file.path, headers: true) do |row|
# IDが見つかれば、レコードを呼び出し、見つかれなければ、新しく作成
user = find_by(id: row["id"]) || new
# CSVからデータを取得し、設定する
user.attributes = row.to_hash.slice(*updatable_attributes)
user.save
end
end
# 更新を許可するカラムを定義
def self.updatable_attributes
["id", "uid", "name", "role", "password", "password_confirmation"]
end