web-dev-qa-db-ja.com

レコードを破棄する際にCarrierwaveでファイルを削除する方法は?

Carrierwave gemを使用してファイルをアップロードしています。

ユーザーが画像を不適切としてフラグを立て、管理者が画像を削除するためのシステムを構築しました。私が知ることができることから、イメージでdestroyを呼び出すと、テーブルからパス名のみが削除されます。

実際にcarrierwaveにファイル自体を削除させる方法はありますか?または、Railsイメージパスを破棄するときにファイルを自動的に削除しますか?

55
Oakland510

CarrierWaveがこれに対して何を提供しているかはわかりませんが、Ruby標準ライブラリのActiveRecordコールバックでFileUtilsを使用できます。

例えば、

require 'FileUtils'
before_destroy :remove_hard_image

def remove_hard_image
  FileUtils.rm(path_to_image)
end

補足:このコードはメモリからのものです。

62
basicxman

@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
101
oconn

ファイルを削除したいが、完全なファイル名を指定したくない場合は、以下を使用できます。

また、特定の拡張子を持つディレクトリ内の多くのファイルまたはすべてのファイルを削除するために使用することができます...

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
1
orion