2013-07-03 61 views
1

我一直在使用Carrierwave進行文件上傳。我沒有嘗試重新上傳文件。現在我想給每個文件一個隨機的名稱和一個與內容類型一致的文件擴展名。我讀了維基和其他網站,並建議在上傳,我可以:如何重命名所有現有的carrierwave上傳的文件?

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.

+0

我會在耙子任務中這樣做 – cgat

回答

3

我知道現在有點老了,但也許對其他人有用。

使用filename方法更新您的上傳器後,就像您一樣,您可以從Rails控制檯運行此操作;

Post.all.each do |p| 
    p.avatar.recreate_versions! 
    p.save! 
end 

在當前版本的CarrierWave中,這將重命名文件並更新模型記錄。

Post當然是型號名稱和avatar您正在安裝上傳器的列,所以請根據需要更改這些列。