プログラミングを完全に理解したエンジニアのメモ

チラ裏レベルのことしか書いてないインターネットの藻屑

carrierwaveで画像名をユニークにした時にS3とDBでファイル名が異なる

問題

ファイル名をユニークにするために以下の処理をしていた

def filename
  p "#{SecureRandom.uuid}.#{file.extension}" if original_filename.present?
end

がs3にcarrierwaveで画像アップ&DBに保存すると、s3とDBのファイル名が違っていた。

この人たちと同じ現象

stackoverflow.com

teratail.com

原因

filenameメソッドが複数回呼ばれているため。 save前に2回、saveの後に1回の計3回呼ばれている。

解決方法

github.com

def filename
  "#{secure_token}.png" 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