Создать вложение activestorage, используя существующий файл в S3 - PullRequest
1 голос
/ 01 апреля 2019

У меня есть модель документа, которая использует ActiveStorage для добавления вложений в документы:

class Document < ApplicationRecord
 has_one_attached :attachment
end

У меня также есть существующая корзина S3 с изображениями в различных форматах: jpg, png.

Мне нужно создать новый документ, в котором вложением является конкретное изображение, уже находящееся в моем контейнере S3.

Пока что я пробовал:

s3 = Aws::S3::Resource.new(region: "us-east-1")
obj = s3.bucket("my-bucket-name").object("s3-object-key")
params = {
 filename: obj.key, 
 content_type: obj.content_type, 
 byte_size: obj.size, 
 checksum: obj.etag.gsub('"',"")
}
blob = ActiveStorage::Blob.create_before_direct_upload!(params)

Это успешно создает объект ActiveStorage :: Blob

Но потом, когда я пытаюсь создать документ, вот так:

d = Document.create!(attachment:blob.signed_id, name: "new document")

Кажется, это связывает вложение, но я не могу просмотреть или загрузить вложение, и обычные активные методы хранения, подобные приведенным ниже, больше не работают:

<%= link_to "View", document.attachment.service_url if doc.attachment %>

Я просто получаю эту ошибку:

undefined method `service_url' for #<ActiveStorage::Attached::One:0x00007fd7d3f161e0>

Если у кого-то есть лучшее предложение о том, как создать документ с вложением, которое соответствует существующему файлу в S3, это было бы очень полезно.

...