はじめに
現場で使える Ruby on Rails 5速習実践ガイド
「Chapter 7 機能を追加してみよう」の「7-6-2CSVデータを入力(インポート)する」で若干詰まったのでメモ。
環境
Ruby 2.6.6
Rails 6.1.3
エラー出現
models、controllers、views、routesに参考書通り記載し、
現れたインポートボタンにmac付属のテキストエディットでcsvファイルを作成しアップロード!
すると、、、
「activerecord::recordinvalid:バリデーションに失敗しました: 名称を入力してください:」と出現。
書いたコードを見返してもタイポ等は見つからず、、、
エラー画面にはtask.save!の所にマーカーが引かれていたので、モデルを確認することにした。
app/models/task.rb
まず処理のロジックを確認する。
def self.import(file) #--1)
CSV.foreach(file.path, headers: true) do |row| #--2)
task = new #--3)
task.attributes = row.to_hash.slice(*csv_attributes) #--4)
task.save! #--5)
end
end
1)fileと言う引数でアップロードされたファイルの内容にアクセスするためのオブジェクトを受け取る。
2)CSV.foreachメソッドを使ってCSVを一行ずつ読み取る。「headers: true」でCSVの一行目を無視する。
3)一行ごとにインスタンス生成。
4)生成したインスタンスをハッシュ形式にして「silce」メソッドで対応する値のみ取り出して入力するようにする。
5)データベースに登録。
つまり処理はOKだがデータベースへの書き込みがうまくいってない、、、??
CSVファイルを確認
自分で作ったCSVファイルをテキストエディットで開く。
name,description,created_at,updated_at
餃子を作る,160個作ります
餃子を冷凍する,160個は食べきれないので冷凍する
カンマ忘れや誤字も特に見つからない。問題ない。。。
試しにvscodeで開く
{\rtf1\ansi\ansicpg932\cocoartf2578
\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fnil\fcharset128 HiraginoSans-W3;}
{\colortbl;\red255\green255\blue255;}
{\*\expandedcolortbl;;}
\paperw11900\paperh16840\margl1440\margr1440\vieww11520\viewh8400\viewkind0
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
\f0\fs24 \cf0 name,description,created_at,updated_at\
\f1 \'e9\'4c\'8e\'71\'82\'f0\'8d\'ec\'82\'e9
\f0 ,160
\f1 \'8c\'c2\'8d\'ec\'82\'e9
\f0 \
\f1 \'e9\'4c\'8e\'71\'82\'f0\'97\'e2\'93\'80\'82\'b7\'82\'e9
\f0 ,160
\f1 \'8c\'c2\'82\'cd\'90\'48\'82\'d7\'82\'ab\'82\'ea\'82\'c8\'82\'a2\'82\'cc\'82\'c5\'97\'e2\'93\'80\'82\'b7\'82\'e9}
!?!?
盛大に文字化け?していました。。。
文字化けのようなギリ読めるような、、、とにかくこれが原因なので、
vscodeで打ち直し、インポートすると無事にCSVは読み込まれました。
そういえば楽天の商品登録とかした時にCSVめっちゃ文字化けしてたな、、、と思い出し、
今後CSVの扱いには文字化けに気をつけようと思いました。