はじめに
CarrierWaveで画像を表示しようとしたとき、以下のようなエラーに直面することがあります。
can't resolve image into URL (undefined method `to_model' for #<CarrierWave::Uploader::Base>)
この記事では、なぜこのエラーが発生するのか、そしてその解決方法について説明します。
症状
これまでは、以下のように .url
を省略して画像を表示できていたのが、
<%= image_tag @user.avatar %>
アップデート後に上記のコードでエラーが発生するようになりました。
原因
CarrierWaveのアップローダーオブジェクトが直接URL文字列を返さなくなり、.url
を使ってURLを取得することが必須になったためです。この動作変更により、CarrierWaveのオブジェクトそのものを image_tag
で渡すと、URLを解決できなくなりました。
解決方法
以下のように、.url
メソッドを明示的に使うことで解決できます。
# 修正後のコード
<%= image_tag @user.avatar.url if @user.avatar.present? %>
.present?
を追加することで、画像がない場合のエラーも回避します。
まとめ
CarrierWaveのバージョンアップにより、.url
の明示的な指定が必要になりました。この変更に対応してコードを修正し、画像を正しく表示しましょう。参考にした情報については以下をご参照ください。
参考リンク
CarrierWave can't resolve image into URL error - Stack Overflow