What's?

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

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

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

まとめ

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

うかい / 株式会社UKAI
うかい@代表取締役兼エンジニア株式会社UKAI
Nobuyuki Ukai

株式会社UKAI 代表取締役CEO。建築を専攻していたが、新卒でYahoo!Japanにエンジニアとして入社。その後、転職、脱サラ、フリーランスエンジニアを経て、田舎へ移住し、ゲストハウスの開業、法人成り。ゲストハウス2軒、焼肉店、カフェ、食品製造業を運営しています。詳細はこちらから

🙏よかったらシェアお願いします🙏
WRITTEN BY
うかい / 株式会社UKAI
うかい@代表取締役兼エンジニア株式会社UKAI

Nobuyuki Ukai

株式会社UKAI 代表取締役CEO。建築を専攻していたが、新卒でYahoo!Japanにエンジニアとして入社。その後、転職、脱サラ、フリーランスエンジニアを経て、田舎へ移住し、ゲストハウスの開業、法人成り。ゲストハウス2軒、焼肉店、カフェ、食品製造業を運営しています。詳細はこちらから

CONACT
入力して下さい
Slack からもどうぞ

※お気軽にどうぞ!(6月20日まで有効!お早めに)

COPYRIGHT © 2020 UKAI CO., LTD. ALL RIGHTS RESERVED.