我正在尝试在使用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创建了新图像
答案 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
此解决方案将重新处理所有版本的用户照片的所有图像上传。但是,它不会删除旧版本,但至少可以正确更新数据库。
现在,我知道此解决方案并不完美。如果有人想尝试回答原始问题,请这样做,我将尝试解决方案。我仍在努力进行其他尝试的原因(以及为什么旧的图像名称又出现在数据库中)的原因仍不清楚,但我只能认为这是某种我无法弄清楚的缓存。