如何使用Rails ActiveStorage将一个对象从一种模型复制到另一种模型

时间:2019-01-15 17:20:57

标签: ruby-on-rails copy rails-activestorage

我当前正在使用Rails 5.2.2。 我正在尝试在2个模型之间复制一张图像。所以我想要2个文件以及blob和附件中的2个条目。 我的原始对象/图像在AWS S3上。

我的原始模型是照片,我的目标模型是 image

我尝试过:

image.file.attach(io: open(best_photo.full_url), filename: best_photo.filename, content_type: best_photo.content_type)

full_url是在photo.rb中添加的方法:

include Rails.application.routes.url_helpers
def full_url
  rails_blob_path(self.file, disposition: "attachment", only_path: true)
end

我收到此错误,好像找不到文件一样:

  

没有这样的文件或目录@ rb_sysopen-   / rails / active_storage / blobs / eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBHZz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--2f865041b01d2f2c323a20879a855f25b231897-888b1381898-a43f88b-d81c-289b-d3c3d1b1bfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfdbfbfbfbfbdbfdbdbfd

我尝试了其他不同的方法(该方法在显示带有image_tag()的图像时使用,并且可以正常工作:

def download_variant(version)
    variant = file_variant(version)
    return rails_representation_url(variant, only_path: true, disposition: "attachment")
  end

相同的错误。

我已验证并且文件在S3服务器上。 我想念什么?

谢谢。

2 个答案:

答案 0 :(得分:0)

好的,我明白了。 我使用了 service_url

image.file.attach(io: open(best_photo.file_variant("large").service_url), filename: best_photo.file.blob.filename, content_type: best_photo.file.blob.content_type)

答案 1 :(得分:0)

您可以将源Blob附加到目标:

ConditionalWeakTable