调用recreate_versions后,Carrierwave无法将数据库更新为正确的值

时间:2019-02-20 16:26:51

标签: ruby-on-rails ruby carrierwave

我正在尝试在使用Carrierwave的Rails应用程序中重新处理所有图像上传,因为我添加了新的图像版本。查看在线上找到的文档和其他示例,我使用以下代码创建了一个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 :(得分:0)

经过大约一天的尝试来解决我的问题,我得到了一种可行的解决方案。这是使用以下代码:

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

此解决方案将重新处理所有版本的用户照片的所有图像上传。但是,它不会删除旧版本,但至少可以正确更新数据库。

现在,我知道此解决方案并不完美。如果有人想尝试回答原始问题,请这样做,我将尝试解决方案。我仍在努力进行其他尝试的原因(以及为什么旧的图像名称又出现在数据库中)的原因仍不清楚,但我只能认为这是某种我无法弄清楚的缓存。