Carrierwave Невозможно обновить базу данных до правильного значения после вызова пересоздания_версий - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь обработать все загрузки изображений в моем приложении Rails, которое использует Carrierwave, так как я добавил новую версию изображения.Глядя на документацию и другие примеры, которые я нашел в Интернете, я создал файл rake со следующим кодом:

namespace :reprocess_user_photo do
    desc "RESIZE"
    task :recreate => :environment do
        User.all.each do |user|
            if user.photo?
                puts user.photo_url
                user.photo.cache_stored_file!
                user.photo.retrieve_from_cache!(user.photo.cache_name)
                user.photo.recreate_versions!
                puts user.photo_identifier
                user.update_column(:photo, File.basename(user.photo_url))
                user.save!
                puts user.photo_identifier
            end
        rescue => e
            puts  "ERROR: User: #{user.id} -> #{e.to_s}"
        end
    end
end

. В результате получается следующее:

/uploads/user/photo/2/1f99e6711141ef7ee2a516db9a197e87.jpg
1f99e6711141ef7ee2a516db9a197e87.jpg
9fda01d5a01ab9803d08d108078345bf.jpg

Из этого я могусмотрите, что файл, который обрабатывается, является правильным.Новый файл имеет новое имя и отображается в правильном каталоге (новый файл можно найти там), но обновление базы данных не является правильным файлом (это имя файла относится к старому файлу, который существовал до того, как я начал работать над этимфункция и была давно удалена).

Я также пытался заменить этот код на:

namespace :reprocess_user_photo do
    desc "RESIZE"
    task :recreate => :environment do
        User.all.each do |user|
            if user.photo?
                puts user.photo_url
                user.photo.cache_stored_file!
                user.photo.retrieve_from_cache!(user.photo.cache_name)
                user.photo.recreate_versions!
                puts user.photo_identifier
                user.photo = File.basename(user.photo_url)
                user.save!
                puts user.photo_identifier
            end
        rescue => e
            puts  "ERROR: User: #{user.id} -> #{e.to_s}"
        end
    end
end

, который имеет вывод:

/uploads/user/photo/2/0401399fd5c9092d5388e97b1991a295.jpg
0401399fd5c9092d5388e97b1991a295.jpg
0401399fd5c9092d5388e97b1991a295.jpg

Этот код делаетне заменять изображение вообще.

Наконец, я попробовал следующее:

namespace :reprocess_user_photo do
    desc "RESIZE"
    task :recreate => :environment do
        User.all.each do |user|
            if user.photo?
                puts user.photo_url
                user.photo.cache_stored_file!
                user.photo.retrieve_from_cache!(user.photo.cache_name)
                user.photo.recreate_versions!
                puts user.photo_identifier
                user.save!
                puts user.photo_identifier
            end
        rescue => e
            puts  "ERROR: User: #{user.id} -> #{e.to_s}"
        end
    end
end

, который имеет вывод

/uploads/user/photo/2/946283bd082efbf970784d3c2c00235c.jpg
946283bd082efbf970784d3c2c00235c.jpg
9fda01d5a01ab9803d08d108078345bf.jpg

В этом тесте было создано новое изображениес именем файла 5f41bc1e46c67e551e9ea36a8109bae2.jpg

1 Ответ

0 голосов
/ 22 февраля 2019

После другого дня или около того попытки решить мою проблему, у меня есть решение, которое работает.Для этого используется следующий код:

def self.reprocess_user_picture
    User.all.each do |user|
        if user.photo?
            user.photo.recreate_versions!
            user.update_column(:photo, File.basename(user.photo.url))
        end
    end
end

Это решение будет повторно обрабатывать все загрузки изображений для фотографии пользователя во всех версиях.Однако он не удалит старые версии, но, по крайней мере, база данных будет обновлена ​​правильно.

Теперь я знаю, что это решение не идеально.Если кто-то хочет попробовать ответить на оригинал, сделайте это, и я опробую решение.Причина, по которой я боролся с другими попытками (и почему старое имя изображения появлялось в базе данных) до сих пор не ясна, но я могу только думать, что это какое-то кэширование, которое я не смог понять.

...