Carrierwave文件名在update_attributes上不断变化

我有模型公司和公司已经安装了carrierwave uploader Logo。

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 

为什么即使没有给出新值,这里的徽标也会以新值更新? 怎么避免这个?

我经历了同样的事情并且发现上传者类的filename方法不应该设置新的文件名,除非original_filename出现。 CarrierWave有一个关于文件名的相关wiki页面 ,不能直接解决这个问题,但足以得到线索。

例如,

每次更新模型时,此代码都会更改文件名字段。

 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