我有一个avatar
上传器,它有多个版本。其中一些是在上传时同步生成的,其他一些是根据请求有条件生成的(this approach之后):
user.avatar.is_processing_delayed = true
user.avatar.recreate_versions!(:png_x60y80)
我将此代码放在控制器中并从那里提供生成的版本,然后由nginx提供服务(因为它已经生成)。这确实创建了文件,如果我在user.avatar.png_x60x80.file
之后立即在同一个上传器实例上调用recreate_versions!
,我会得到一个文件对象。但是,如果我在同一个头像的另一个实例上调用它(例如User.find(user.id).avatar.png_x60x80.file
),我会得到nil
。这不会是一个问题,但我认为它会导致以下问题:当我删除用户的头像时,只会删除同步创建的版本。不知何故,recreare_versions!
不会保留有关重新创建版本的数据。有什么东西我不见了吗?我还希望删除在更新头像时根据请求创建的所有版本,以便nginx不会提供以前生成的旧头像版本,但由于此问题,它也存在问题。
Carrierwave版本:1.0。
答案 0 :(得分:0)
最终我选择了以下解决方法。不完美,但按预期工作。
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
end