【Rails】CarrierWaveでアップロードした画像が読み込めなくてハマった話

最近の興味はもっぱらGo言語ですが、半分授業半分趣味という感じでテーブル60~70個ほど、中規模いかないくらいのWebサイトをRailsで作っています。

画像のアップロード処理にCarrierWaveというgemを使っていますがこれを使う過程でハマってしまい、解決にそこそこ時間を費やしたのでメモしておこうと思います。

 

ハマった際の現象

  • 画像のアップロードはできる(指定したフォルダに画像がアップロードされている)
  • @model_name.image.urlなどで画像のフルパスは返ってくる
  • @model_name.image?ではfalseが返ってくる
  • Viewに表示することができない
  • File.open(@model_name.image.url)で開けない

というものです。

 

原因その1:アップロード先のフォルダがpublic配下以外の場所を指定している

考えてみれば当たり前のことでした。アップロード先をS3などapp配下以外にしている場合はパーミッションなどを見なおしてみるとよいかもしれません。

 

 

原因その2:filenameメソッドの中でuuidを生成している

こちらが原因であることを特定するまでに時間を要しました。

例えばrails g uploader hoge_uploaderというコマンドでHogeUploaderクラスを作成すると、filenameメソッドコメントアウトされてついてくると思います。これはアップロードされた画像のファイルを変更する場合に使うメソッドですが、ここで私は以下のようにしていました。

...これがまずかったようです。とは言っても何かエラーが吐かれるわけでもなく、画像名はちゃんとUUIDになっていますし、macのfinderやプレビューでは画像自体は開くことができますがこれではRailsは開けないようです。

正しくはCarrierWaveのwikiにも載っているように

とするべきみたいです。

これで読み込むことができました。

 

ちなみに...

と秒までの日時で命名する処理で作成された画像は読み込むことができますが

 と6桁のミリ秒を追加すると読み込めなくなります。

...謎です。

 

ひとまずなぜこれで動くのかを特定しようとしましたが、いかんせんCarrierWaveがgemである(Railsの標準ではない)こと、Railsが下層の処理の部分を隠し過ぎ引き受けている親切言語であることなどの理由で中々特定できていません。ひとえに僕の力不足です。

時間のあるときにCarrierWaveの開発者にメールで質問してみることにします。