首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Carrierwave:“recreate_versions!奇怪的行为

Carrierwave:“recreate_versions!奇怪的行为
EN

Stack Overflow用户
提问于 2018-03-02 22:24:45
回答 1查看 100关注 0票数 1

我有一个avatar上传器,有多个版本。其中有些是上传时同步生成的,有些则是根据请求有条件地生成的(遵循this approach):

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

发布于 2018-03-05 21:58:31

最终,我接受了下面的变通方法。不是完美的,但工作如预期。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49071087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档