我有一个avatar上传器,有多个版本。其中有些是上传时同步生成的,有些则是根据请求有条件地生成的(遵循this approach):
user.avatar.is_processing_delayed = true
user.avatar.recreate_versions!(:png_x60y80)我把这段代码放在一个控制器中,并从那里为生成的版本提供一次服务,之后它由nginx提供服务(因为它已经生成了)。这实际上创建了文件,如果我在recreate_versions!之后立即在同一个uploader实例上调用user.avatar.png_x60x80.file,我会得到一个文件对象。但是,如果我在同一个头像的另一个实例(例如User.find(user.id).avatar.png_x60x80.file)上调用它,我会得到nil。这不是问题,但我认为这会导致以下问题:当我删除用户的头像时,只会删除同步创建的版本。不知何故,recreare_versions!不会持久化有关重新创建的版本的数据。我是不是漏掉了什么?我还想删除所有在更新头像时根据请求创建的版本,这样nginx就不会提供以前生成的旧头像版本,但由于这个问题,这也是有问题的。
Carrierwave版本: 1.0。
发布于 2018-03-05 21:58:31
最终,我接受了下面的变通方法。不是完美的,但工作如预期。
mount_uploader :avatar, AvatarUploader
def remove_avatar!(*args)
remove_all_avatar_versions
super(*args)
# Somehow wrapping the "remove_avatar!" method changes its behavior:
# model attribute is not updated and we have to update it manually.
write_attribute(:avatar, nil)
end
def avatar=(*args)
remove_all_avatar_versions
super(*args)
end
private
def remove_all_avatar_versions
return unless avatar?
avatar.versions.each_key do |v|
# You have to implement the avatar_path method.
path = avatar_path(v)
File.delete(path) if File.exist?(path)
end
endhttps://stackoverflow.com/questions/49071087
复制相似问题