Carrierwave gemを使用してファイルをアップロードしています。
ユーザーが画像を不適切としてフラグを立て、管理者が画像を削除するためのシステムを構築しました。私が知ることができることから、イメージでdestroyを呼び出すと、テーブルからパス名のみが削除されます。
実際にcarrierwaveにファイル自体を削除させる方法はありますか?または、Railsイメージパスを破棄するときにファイルを自動的に削除しますか?
CarrierWaveがこれに対して何を提供しているかはわかりませんが、Ruby標準ライブラリのActiveRecordコールバックでFileUtils
を使用できます。
例えば、
require 'FileUtils'
before_destroy :remove_hard_image
def remove_hard_image
FileUtils.rm(path_to_image)
end
補足:このコードはメモリからのものです。
@mu_is_too_shortが言ったように、File#deleteを使用できます。
Railsアプリを少し調整してヘルパーとして使用できるコードスニペットを次に示します。
def remove_file(file)
File.delete(file)
end
または、ファイル名をfileに保存している場合
def remove_file(file)
File.delete("./path/to/#{file}")
end
ファイルを削除したいが、完全なファイル名を指定したくない場合は、以下を使用できます。
また、特定の拡張子を持つディレクトリ内の多くのファイルまたはすべてのファイルを削除するために使用することができます...
file = Rails.root.join("tmp", "foo*")
または
file = Rails.root.join("tmp", ".pdf")
files = Dir.glob(file) #will build an array of the full filepath & filename(s)
files.each do |f|
File.delete(f)
end