はじめに
Ruby on Railsで画像をアップロードする際に、
ファイル名を時間にすることがあるかと思います。
そのやり方でやったところ、うまくいかなかったため、共有します。
(7/8 追記)
@komiyakさんから、コメント頂きました。
そちらもご参照頂ければと思います。
問題点
オリジナルとthumbとでファイル名がずれることがある
アップロード時にthumbを作成するようにしていたところ、
下記のように、作成時間がずれるとファイル名が変わってしまい、
viewで表示する際に手間が発生してしまいました。
20160313184754.jpg thumb_20160313184755.jpg
画像以外の要素を更新時にimageセルも変更されてしまう。
画像をアップロードせずに他の要素を更新すると、
imageセルの記載が更新され、アップロードされている画像のファイル名は更新されないため、
読み込めなくなってしまいました。
参照:CarrierWaveでアップロードした画像のファイル名を日時にすると困る
公式ドキュメントをもとにユニークなファイル名にしました。
photo_uploader.rb
class PhotoUploader < CarrierWave::Uploader::Base
def filename
"#{secure_token}.#{file.extension}" if original_filename.present?
end
protected
def secure_token
var = :"@#{mounted_as}_secure_token"
model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.uuid)
end
end
参照:How to: Create random and unique filenames for all versioned files