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"=>"ファイル読み込み登録"}
users
User Load (0.2ms) SELECT.* FROM
usersWHERE
users.
idIS NULL LIMIT 1
パラメータとしては渡っている。。
しかしSELECT
users.* FROM
usersWHERE
users.
idIS 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はよく使うようにしてます。