DEVELOPMENT
web
Rails
はじめに
Ruby on Rails で画像をmodelで扱う際、よく使われるのは、
などが一般的かと思いますが、今回は、Carrierwaveを使う際、設定でアップロードされるファイル名にtimestampを含めると、リンク切れになり、画像が表示されない問題が発生したので、その時の対処法をご紹介します。
前提
- Ruby on Rails で、Carrierwaveでの画像投稿機能を実装し、upload出来る状態にある
Uploader
保存する際のファイル名を、以下のようにして、タイムスタンプを使用していました。
class ImageUploader < CarrierWave::Uploader::Base
.
.
.
省略
.
.
.
def filename
"#{mounted_as}_#{Time.now.to_i}.#{file.extension}" if original_filename
end
end
問題なさそうなのですが、たまに、画像がリンク切れする
原因
DBに保存された、ファイル名と、実際保存されたファイル名が、timestampのズレで、異なってしまうことにより、 画像の表示が正常にされない問題が発生しました。
方法
class ImageUploader < CarrierWave::Uploader::Base
.
.
.
省略
.
.
.
def filename
"#{mounted_as}_#{timestamp}.#{file.extension}" if original_filename
end
def timestamp
var = :"@#{mounted_as}_timestamp"
model.instance_variable_get(var) or model.instance_variable_set(var, Time.now.to_i)
end
end
これにより、ズレがなくなります。
▶ 参考: How to: Use a timestamp in file names
まとめ
そもそも、ファイル名に、タイムスタンプ入れなくてもいいけどね
⬇🙏よかったらシェアお願いします🙏⬇
Nobuyuki Ukai
株式会社UKAI 代表取締役CEO。建築を専攻していたが、新卒でYahoo!Japanにエンジニアとして入社。その後、転職、脱サラ、フリーランスエンジニアを経て、田舎へ移住し、ゲストハウスの開業、法人成り。ゲストハウス2軒、焼肉店、カフェ、食品製造業を運営しています。詳細はこちらから