Как скопировать один объект из одной модели в другую с помощью Rails ActiveStorage - PullRequest
0 голосов
/ 15 января 2019

В настоящее время я использую Rails 5.2.2. Я пытаюсь скопировать одно изображение между двумя моделями. Поэтому я хочу 2 файла и 2 записи в BLOB-объектах и ​​вложениях. Мой оригинальный объект / изображение на AWS S3.

Моя оригинальная модель - , фото , моя целевая модель - , изображение .

.

Я пробовал это:

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--2f865041b01d2f2c323a20879a855f25f231289d/881dc909-88ab-43b6-8148-5adbf888b399.jpg?disposition=attachment

Я пробовал другие разные вещи, такие (этот метод используется при отображении изображений с помощью image_tag () и работает правильно:

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

Та же ошибка.

Я подтвердил, и файл присутствует на сервере S3. Что я пропустил?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Вы можете прикрепить исходный BLOB-объект к цели:

image.file.attach best_photo.file.blob
0 голосов
/ 15 января 2019

ОК, я понял.Я использовал 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)
...