[CarrierWave] すでにアップロードされた画像ファイルに新しいバージョンを追加する

Railsでファイルアップロード機能を実現するためのGemパッケージにCarrierWaveというものがあります。便利なのでRailsアプリケーションを開発するときには必ずといっていいほど使っています。

CarrierWaveの便利な機能の一つに、画像アップロード時にサイズが異なる複数のバージョンを自動的に生成してくれるというものがあります。

以下の例では、normalバージョン(48×48)とlargeバージョン(100×100)の2種類のバージョンを、画像アップロード時に自動的に作成するように指定しています。

さてここで、すでにアップロードされた画像ファイルに新しいバージョンを追加したい場合を考えます。例えば、画像ファイルにsmallバージョン(32×32)を加えたい場合、上記のサンプルコードは以下のようになります。

こうすることで、新しく画像ファイルをアップロードした時には、自動的にsmallバージョンが生成されるようになります。

ですが、すでにアップロードされていた画像ファイルはどうでしょうか?各バージョンの画像ファイルが生成されるのは画像ファイルがアップロードされた時なので、すでにアップロードされていた画像ファイルのsmallバージョンはこのままでは生成されません。

では、どうすればいいのでしょうか?

ご心配なく。実は、CarrierWaveにはrecreate_versions!という便利なメソッドが用意されてます。

例えば、Userモデルのprofile_imageプロパティに画像ファイルの情報を保存するように設定していた場合、以下のコードを実行することで、今までアップロードされた全ての画像ファイルの全バージョンを作りなおすことができちゃいます。

上記のコードをscript/recreate_versions.rbに保存して、以下のコマンドを実行すればいつでもバージョンをつくりなおせるようになりますね。

あらかじめ、今後必要になりそうなバージョンをすべて定義できればいいんですが、アプリケーションの仕様は刻一刻と変化するのでなかなか難しいですよね。

そんなときにこの記事で紹介した方法を思い出していただければ、少し楽に作業をすすめることができるかと思います。

どこかの誰かのお役に立てれば。それでは!