Carrierwave:“recreate_versions!”奇怪的行为

问题描述 投票:1回答:1

我有一个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。

ruby-on-rails ruby carrierwave
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.