Carrierwave:“recreate_versions!”奇怪的行为

时间:2018-03-02 14:24:45

标签: ruby-on-rails ruby carrierwave

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

1 个答案:

答案 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