👻

present? をすると 'invalid byte sequence in UTF-8' となる

2023/10/10に公開

tl;dr

  • present?/nil? が常に nil? を代替できるわけではない
    • 型に気をつける

事象としておきたこと

  • S3 に保存している PDF の有無を判定しようとした
  • バケットの特定のキーから取得したデータを present? で判定しようとしたところ 'invalid byte sequence in UTF-8' となった
    • NoSuchKey のとき nil となる仕組みが別途存在

コードリーディング

present?

present?`` は blank?` の反対によって定義されます

https://github.com/rails/rails/blob/358d3d3164bef399b19b089f5fed8664a2c3d39e/activesupport/lib/active_support/core_ext/object/blank.rb#L22-L27

blank?

blank? は各 class に対して挿入されるが、今回は String 型だったため正規表現マッチが実施され UTF-8 文字列でないためエラーとなった

https://github.com/rails/rails/blob/358d3d3164bef399b19b089f5fed8664a2c3d39e/activesupport/lib/active_support/core_ext/object/blank.rb#L103-L132

なぜ String になったのか

AWS SDK で S3 から get した body が String | StirngIO | File でこれを read していた。

API ドキュメントより

:body (String, StringIO, File) — Object data.

対応策

  • nil? で対応できました。

まとめ

  • 型に対する認識が甘かった

参考

Discussion