5

我有模型公司和公司已經安裝了carrierwave上傳器徽標。Carrierwave文件名在update_attributes上不斷變化

class Company < ActiveRecord::Base 
    mount_uploader :logo, LogoUploader 

圖片上傳工作,但我有一個問題update_attributes。當用戶只想更新公司的描述或標題,但不想上傳新圖像時 - 每次都在更改DB中的文件名值。這裏有一個簡單的例子:

1.9.3-p545 :004 > a = Company.last 
1.9.3-p545 :005 > a.update_attributes(:title => "test title 2") 
(0.4ms) BEGIN 
    Company Exists (0.9ms) SELECT 1 AS one FROM `companies` WHERE (`companies`.`title` = BINARY 'test title 2' AND `companies`.`id` != 37) LIMIT 1 
    Company Load (0.7ms) SELECT `companies`.* FROM `companies` WHERE `companies`.`id` = 37 LIMIT 1 
    (0.7ms) UPDATE `companies` SET `title` = 'test title 2', `logo` = '1396206630_1f288be4.jpg', `updated_at` = '2014-03-30 19:10:30' WHERE `companies`.`id` = 37 
    (8.1ms) COMMIT 
=> true 

爲什麼標誌在這裏用新值更新,即使沒有給出新的值?如何避免這種情況?

+0

'數據庫中的文件名值每次都會改變'新文件名或現有文件名?更新前的原始文件名是什麼?你的意思是'1396206630_1f288be4.jpg'是一個新的文件名嗎? –

+0

使用新的文件名。雖然沒有新文件上傳。 – Povkys

回答

5

我也經歷過相同的計算,上傳類'filename方法不應該設置一個新的文件名,除非original_filename介紹。 CarrierWave有關於文件名的a relevant wiki page沒有直接解決這個問題,但足以得到一個線索。

例如,

此代碼在每次更新模型時更改文件名字段。

class SampleUploader < CarrierWave::Uploader::Base 
    def filename 
    "#{Time.now.strftime('%Y%m%d%H%M%S')}.jpg" 
    end 
end 

但是這種額外的if語句防止前者的行爲。

class SampleUploader < CarrierWave::Uploader::Base 
    def filename 
    "#{Time.now.strftime('%Y%m%d%H%M%S')}.jpg" if original_filename.present? 
    end 
end 
+0

這應該是被接受的答案。爲我工作。儘管如此,每當記錄更新時,carrierwave都會觸發該文件名方法,這很奇怪。 – zarathustra