👻
present? をすると 'invalid byte sequence in UTF-8' となる
tl;dr
- present?/nil? が常に nil? を代替できるわけではない
- 型に気をつける
事象としておきたこと
- S3 に保存している PDF の有無を判定しようとした
- バケットの特定のキーから取得したデータを
present?
で判定しようとしたところ 'invalid byte sequence in UTF-8' となった- NoSuchKey のとき nil となる仕組みが別途存在
コードリーディング
present?
present?`` は
blank?` の反対によって定義されます
blank?
blank? は各 class に対して挿入されるが、今回は String 型だったため正規表現マッチが実施され UTF-8 文字列でないためエラーとなった
なぜ String になったのか
AWS SDK で S3 から get した body が String | StirngIO | File
でこれを read していた。
:body (String, StringIO, File) — Object data.
対応策
-
nil?
で対応できました。
まとめ
- 型に対する認識が甘かった
参考
-
Object#present?や#blank?で invalid Byte Sequence in UTF 8 になる時の対処法
- ほぼ同じことをかいてた。ひととおり書いた後に気付いた。
- Turbo 8 is dropping TypeScript
Discussion