Rails4 csvファイルをアップロードして読み込む
ユーザーをCSVファイルから登録したかった。
csvファイルをアップロードして読み込む方法をメモする。
ルーティングの設定
アップロードするCSVファイルの指定画面と、CSVファイルの読み込み処理のルーティングを設定する。
config\routes.rbに下記のように記載する。
resources :users do collection do get 'import_csv_new' post 'import_csv' end end
ビューの作成
CSVファイルの指定画面を作成する。
app\viewsにimport_csv_new.html.erbファイルを作成し、下記のように記載する。
※form_tagでは、multipartを別ハッシュにすること。
<h1>社員登録(CSVファイル)</h1> <%= form_tag({controller: "users", action: "import_csv", method: "post"}, {multipart: true}) do %> <div class="field"> <%= label_tag "CSVファイルを選択" %><br> <%= file_field_tag :csv_file %> </div> <div class="actions"> <%= submit_tag "CSVファイルを読み込む"%> </div> <% end %> <%= link_to '社員一覧に戻る', users_path %>
コントローラの作成
app\controllers\users_controller.rbに下記を追記する。
def import_csv_new end def import_csv respond_to do |format| if User.impotr_csv(params[:csv_file]) format.html { redirect_to users_path } format.json { head :no_content } else format.html { redirect_to users_path, :notice => "CSVファイルの読み込みに失敗しました。" } format.json { head :no_content } end end end
モデルのメソッドの作成
app\models\user.rbにメソッドを作成する。
まず、ファイルの先頭でライブラリを2つ読み込む
# coding: utf-8 require 'csv' # csv操作を可能にするライブラリ require 'kconv' # 文字コード操作をおこなうライブラリ class User < ActiveRecord::Base
CSVファイルを読み込み、ユーザーを登録する関数を作成する。
※実際はデータチェックなどが必要
# CSVファイルを読み込み、ユーザーを登録する def import_csv(csv_file) # csvファイルを受け取って文字列にする csv_text = csv_file.read data = [] #文字列をUTF-8に変換 CSV.parse(Kconv.toutf8(csv_text)) do |row| user = User.new user.name = row[0] #csvの1列目を格納 user.kana = row[1] #csvの2列目を格納 user.address = row[2] #csvの3列目を格納 user.tel = row[3] #csvの4列目を格納 user.save end end
参考:
Ruby on Rails 3.2: CSVをアップロードしてActiveRecordにつっこむ | DYO.JP ver.2
【前編】SHIFT-JISのCSVをUTF-8でRailsにインポート (Rails 3.2.13) | heathrow.lab
【後編】SHIFT-JISのCSVをUTF-8でRailsにインポート (Rails 3.2.13) ~ActiveModelの活用 | heathrow.lab
Railsでuploadされたfile(txt等)の内容を読み込む - 初心者エンジニアのメモ帳
ファイルをアップロードしてみよう(file_field) Ruby on Rails Pro