5

모델 회사와 회사가 carrierwave uploader 로고를 마운트했습니다.update_attributes에서 Carrierwave 파일명이 계속 바뀌고 있습니다.

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

새 파일 이름 또는 기존 파일 이름으로'DB의 파일 이름 값은 계속 변경됩니다 '? 업데이트하기 전에 원본 파일 이름은 무엇입니까? '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

관련 문제