将carrierwave文件从一个记录复制到另一个记录的正确方法是什么?

pup*_*eno 19 ruby-on-rails carrierwave

我需要将文件从一个载波对象复制到另一个载波对象.它们是不同的表格和不同类型的上传者.

我开始时:

user.avatar = image.content
Run Code Online (Sandbox Code Playgroud)

(其中用户和图像是模型实例,头像和内容是载波装载的上载器),有时可以工作.它似乎一直在本地工作,有文件存储,但在使用雾和s3时间歇性.

邮件列表帖子中,我找到了这段代码:

user.avatar = image.content.file
Run Code Online (Sandbox Code Playgroud)

那时候又有效了.

到目前为止,我的工作方案是:

require "open-uri"

begin
  user.avatar = open(image.url)
rescue Errno::ENOENT => e
  begin
    user.avatar = open(image.path)
  rescue Errno::ENOENT => e
    # Ok, whatever.
  end
end
Run Code Online (Sandbox Code Playgroud)

这不仅难看,而且无法通过扩展验证,因为远程文件的打开不能保持扩展名(jpg,png等).

Dia*_*rat 13

也许您可以采用的一种方法是根据Carrierwave gem文档设置远程图像URL ?

user.remote_avatar_url = image.url
Run Code Online (Sandbox Code Playgroud)

  • 如果图像不通过HTTP提供,则无效.您将收到以下错误:`图标试图下载不通过HTTP提供的文件 (5认同)
  • `user.avatar = object.image`似乎是更好/更合适的方式,因为`remove_avatar_url`仅适用于`remote urls` (3认同)

equ*_*nt8 7

从这里讨论的解决方案,我创建了简单的CopyCarrierwaveFile gem来做到这一点

用法是这样的:

original_resource = User.last
new_resource      = User.new

CopyCarrierwaveFile::CopyFileService.new(original_resource, new_resource, :avatar).set_file    

new_resource.save
nev_resource.avatar.url # https://...image.jpg
Run Code Online (Sandbox Code Playgroud)