#Rails5でCSV読み込んで一括ユーザー登録機能作成
CSVの読み込みでちょっとつまずいたのでメモ。
ほんとーに初歩的なミスでした。
基本的にコチラを参考にさせてもらいました。
https://qiita.com/seitarooodayo/items/c9d6955a12ca0b1fd1d4
さて出てきたエラーはコチラ
ActiveRecord::RecordInvalid (Validation failed: Name can't be blank, Password can't be blank, Password can't be blank, Password is too short (minimum is 6 characters)):
よくあるバリデーションに引っかかったやつですね。
blankってことはnilになっちゃってると言うことか。
と言うことはcsvファイルが読み込まれてないのか?
Parameters: {"utf8"=>"✓", "authenticity_token"=>"lzZScpvbb+vbmrJaxYMW3SweQrA0ISM0ssFX9GKIIL1gU6EMWD3IutOb0x5QnaLQwVcW1hUnNMTnZSxTgsHAvw==", "file"=>#<ActionDispatch::Http::UploadedFile:0x00007fe4b41926e8 @tempfile=#<Tempfile:/tmp/RackMultipart20200320-11805-1j4vvvo.csv>, @original_filename="csvimporttest.csv", @content_type="text/csv", @headers="Content-Disposition: form-data; name=\"file\"; filename=\"csvimporttest.csv\"\r\nContent-Type: text/csv\r\n">, "commit"=>"ファイル読み込み登録"} User Load (0.2ms) SELECT
users.* FROM
usersWHERE
users.
id IS NULL LIMIT 1
パラメータとしては渡っている。。
しかしSELECT
users.* FROM
usersWHERE
users.
id IS NULL
なんでだ、、binding.pryしてみよう。
11: def self.import(file) 12: CSV.foreach(file.path, headers: true) do |row| 13: # IDが見つかれば、レコードを呼び出し、見つかれなければ、新しく作成 14: user = find_by(id: row["id"]) || new 15: # CSVからデータを取得し、設定する 16: binding.pry => 17: user.attributes = row.to_hash.slice(*updatable_attributes) 18: # 保存する 19: user.save! 20: end 21: end
[1] pry(User)> puts user.attributes {"id"=>nil, "name"=>nil, "firstchild"=>nil, "secondchild"=>nil, "thirdchild"=>nil, "password_digest"=>nil, "email"=>nil, "admin"=>false, "created_at"=>nil, "updated_at"=>nil} => nil [2] pry(User)> puts user => nil [3] pry(User)> puts row Id 9 Name シーエスブイ太郎1 Password Csvtest1 password_confirmation Csvtest1
あ、rowには値が入ってる。。
その先に値が渡ってない。
ん?IdとかNameとか大文字入ってるジャン。ひょっとして、、、あーやっぱり。
と言うことでMacbookのnumbersで作成したcsvファイルだったのですがデフォルトで入力値の頭文字が大文字になる仕様でした。。
気づかずそのまま使ってたのが原因でしたね。
初歩的な原因でしたけど、こう言う風に原因追求するのってプログラミングの面白さの一つですよね。
binding.pryはよく使うようにしてます。