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