Carrierwave と fog で「 NoMethodError - undefined method `key' for nil:NilClass: 」

って、出たんだけどあまり有効なログが一緒に出てくれなくてどうして良いかわからなかったとです。

現象としては、Carrierwaveでcache場所をS3にした時に、バリデーションエラーが一回起きてから保存した際にのみ発生。

また、herokuのproductionでだけ発生(していると思い込んでて)、ログを仕込むにも仕込みにくい感じでどうするかと思ってたところ、いくつか設定できるものを発見して、結果解決できたので置いときますね。

とりあえず結論: どうやら当該のエラーは存在するはずのファイルが無い場合に結果として起こるらしいですよ。


EXCON_DEBUG=true

https://stackoverflow.com/questions/22926523/how-to-debug-fog-and-carrierwave-setting-remote-avatar-url-to-facebook-profile

通信するのに使っているライブラリのデバッグモードですね。通信系のログが丁寧になります。素敵!


DEBUG_RESPONSE=true

FogがXMLの通信結果をパースしている時にエラーの場合にこれが有効だとログにでるぽいです。多分今回は役に立たなかったけど、せっかく調べたので置いときますね。


herokuに設定する時には

下記のような感じですね。

$ heroku config:set EXCON_DEBUG=true

あとは

$ heroku logs --tail

して、エラー時のレスポンスをコピペしてきてジックリ拝見しました。終わったらデバッグの設定オフにしないとログが出過ぎてしまうので戻しましょうね。


私のへま


  1. アップされたファイルをuploaderで強制的にpngに変換していた

  2. jpgファイルをアップした時などにバリデーションエラーになる

  3. S3上のファイルはpngに変換されているけれども再通信する時にはjpgで取りに行く

  4. 「ファイルあらへんねん」って404が返ってました。

はよ言ってやw

ほんとはどこかのタイミングで適切な例外メッセージ入れて投げると良いんでしょうね(PullRequestせよって事案なのわかります。手の空いた時にやらせて。今は無理)。


おしまいに

Carrierwaveは便利ですがこの辺りを整合しないといけないのちょっと辛い時ありますね。もうすぐActiveStorageさんがスーパーになって忘れていい知識になるんでしょう。と、願ってます。