Top / 【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
うかい@エンジニア出身CEO株式会社UKAI
Nobuyuki Ukai

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

ホームページ作成、ECサイト掲載、商品ブランディング等、ご依頼やご相談は


CONACT
入力して下さい
WRITTEN BY
うかい / 株式会社UKAI
うかい@エンジニア出身CEO株式会社UKAI

Nobuyuki Ukai

株式会社UKAI 代表取締役CEO。建築を専攻していたが、新卒でYahoo!Japanにエンジニアとして入社。その後、転職、脱サラ、フリーランスエンジニアを経て、田舎へ移住し、ゲストハウスの開業、法人成り。ゲストハウス2軒、焼肉店、カフェ、食品製造業を運営しています。2020年コロナウイルスの影響で、ゲストハウスとカフェを閉店。現在は、ECサイト新規リリース、運営と、黒毛和牛の牝牛ブランディングをしメディア立ち上げ。牝牛のお肉と、独自食品開発した食品をまもなく販売開始予定。詳細はこちらから

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