【Rails】Carrierwaveでファイル名にタイムスタンプを入れると表示されない件

目次

【Rails】Carrierwaveでファイル名にタイムスタンプを入れると表示されない件

はじめに

Ruby on Rails で画像をmodelで扱う際、よく使われるのは、

などが一般的かと思いますが、今回は、Carrierwaveを使う際、設定でアップロードされるファイル名にtimestampを含めると、リンク切れになり、画像が表示されない問題が発生したので、その時の対処法をご紹介します。




前提


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

まとめ

そもそも、ファイル名に、タイムスタンプ入れなくてもいいけどね

U-chan ( Nobuyuki Ukai )

学生時代は建築やデザインを専攻していたが、Yahoo!Japanにエンジニアとして運良く入社し、2年半で波情報を配信する波伝説に転職。3年後、Yahoo!時代の先輩の立ち上げたベンチャーに転職。数年後、伊豆下田に移住し、ゲストハウスを開業しながらリモートでエンジニアを続けたが、焼肉店の開業とともに株式会社UKAIを立ち上げ、法人成り。その後、カフェとゲストハウスをもう一軒開業し、現在は焼肉店、カフェ、ゲストハウス2件目を運営。今季は自社Webサイトの立ち上げ予定!

comments powered by Disqus