2016-09-18 12 views
0

У меня есть тысячи изображений, загруженных со следующей структурой имен файлов.carrierwave recreate_version создает превью с именами файлов, отличными от исходного сохраненного имени файла

def filename 
"#{model.id}" + "-v#{timestamp}" + "-" + Category.find("#{model.category_id}").slug + "-" + CategoryItem.find("#{model.category_item_id}").slug + ".png" if original_filename.present? 
end 

def timestamp 
    var = :"@#{mounted_as}_timestamp" 
    model.instance_variable_get(var) or model.instance_variable_set(var, Time.now.to_i) 
end 

Мне нужно создать превью для всех изображений, чтобы ускорить определенное время загрузки страницы. Я установки версии большого пальца в файл пользователя

# Create different versions of your uploaded files: 
    version :thumb do 
    process :resize_to_limit => [110, nil] 
    end 

, но теперь, когда я бегу: CategoryItem.each {|item| item.image_value.recreate_versions! if item.image_value? }

создан большой палец, но имя файла большого пальца изображения не совпадает с исходным файлом с за добавленным «thumb_» в начале имени файла.

saved filename: 1-v1474175808-shoes-runners.png 

thumb filename: thumb_1-v1472111618-shoes-runners.png (different timestamp) 

CategoryItem.find(1).image_value_url(:thumb): thumb_1-v1474175808-shoes-runners.png (original filename timestamp) 

Так вызова image_tag CategoryItem.find(1).image_value_url(:thumb) ищет файл, который не существует.

Как я могу запустить recreate_versions и иметь имя файла большого пальца так же, как и исходное сохраненное имя файла, но с добавлением «thumb_» на передний план, не удаляя отметку времени?

Update:

я теперь следующее нахождение этой https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Customize-your-version-file-names

version :thumb do 
    process :resize_to_limit => [110, nil] 

    def full_filename(for_file = model.image_value.file) 
    'thumb_' + File.basename(model.image_value.path).to_s 
    end 
    end 

моя проблема в том, что даже если я звоню прямое имя файла File.basename(model.image_value.path).to_s, когда я бегу recreate_versions он все еще сохраняет файл с текущей меткой времени, а не захват исходного имени файла. Я подумал, что, возможно, имя файла меняется в БД и захватывает новое имя файла, но оно остается таким же, как ожидалось, поэтому я понятия не имею, почему он не захватывает прямое значение из db и не создает случайную метку времени в названии.

Также я, хотя, возможно, def full_filename(for_file = model.image_value.file) разве работает, но если я изменить его на

version :thumb do 
    process :resize_to_limit => [110, nil] 

    def full_filename(for_file = model.image_value.file) 
    'thumb_' + "random-text" 
    end 
    end 

большого пальца изображение сохраняется как «thumb_random-текст», так она проходит через этот код

ответ

0

надстройке следующий метод ваш класс Uploader

def timestamp 
    model.created_at 
end 

def filename 
    # custom name, or you can debug this first 
end 

version :thumb do 

    def full_filename(for_file = model) 
    'thumb_' + filename 
    end 

    def filename 
    # custom name, or you can debug this first 
    end 

end 
+0

Он по-прежнему сохраняет текущую временную метку, а не имя исходного изображения. Я устал ''thumb_' + model.image_value.to_s', но он использует весь url – Rob

+0

, можете ли вы пояснить, почему вы указываете метку времени в имени файла? –

+0

Метод отметки времени непосредственно из документов несущей. Я добавил '' thumb_ '+ File.basename (model.image_value.path) .to_s' из чтения http://stackoverflow.com/questions/5132847/displaying-a-carrierwave-filename-in-the-view. 'File.basename (model.image_value.path) .to_s' захватывает точное имя файла, сохраненное в db, но оно все же дает ему текущую временную метку в сохраненном имени файла и не копирует имя файла непосредственно из db. – Rob