しばらくの間、ファイルのアップロードに Carrierwave を使用しています。ファイルがアップロードされたときにファイルの名前を変更しようとしませんでした。ここで、各ファイルにランダムな名前と、コンテンツ タイプと一致するファイル拡張子を付けたいと思います。wiki や他のサイトを読んだところ、アップローダーで次のことができるように推奨されました。
def filename
"#{secure_token}.#{file.extension}" if original_filename.present?
end
private
def secure_token
#implement the secure token
end
アップローダへのこれらの追加後にアップロードされたファイルでは正常に機能しました。しかし、この変更の前にアップロードされた多くのファイルを取得しました。誰かが古いファイルを移行する方法を教えてくれるかどうか疑問に思っていました.
アップローダーにメソッドを追加してみました:
def rename_file!
model.update_attribute mounted_as, "#{secure_token}.#{file.extension}"
recreate_versions!
end
次に、レールコンソールで、アタッチメント付きのモデルでこれを呼び出してみました。ただし、モデルの列が更新されていないことがわかりましたがmounted_as
、ファイル システムでは、さまざまなバージョンのファイルが新しい名前で作成されていました。モデルのフィールドを調べたところ、mounted_as
更新されていませんでした。ログは実際には、列が古い値で更新されたと述べています。
mounted_as
モデルの列を更新するにはどうすればよいですか?
さらに、古い名前の古いファイルがまだファイル システムに残っているように見えました。それらを削除する方法はありますか?私は行を追加しようとしました:
file.move_to File.join("#{File.dirname file.path}, "#{secure_token}.#{file.extension}")
rename_file!
メソッドで。mounted_as
ファイルの名前が変更されましたが、モデルの列は更新されませんでした。そのため、その URL にアクセスすると 404 が発生しました。