У меня есть модель документа, которая использует 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, это было бы очень полезно.