38
27

More than 5 years have passed since last update.

CarrierWaveでのファイル名には時間を設定しないほうがいい

Last updated at Posted at 2016-03-13

はじめに

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

38
27
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
27