Ответ 1
Возможно, один из способов сделать это - установить URL удаленного изображения в соответствии с документацией о драгоценности Carrierwave?
user.remote_avatar_url = image.url
Мне нужно скопировать файл из одного объекта несущей волны в другой. Это разные таблицы и разные типы загрузчиков.
Я начал с:
user.avatar = image.content
(где пользователь и изображение являются экземплярами модели, аватар и контент - это загруженные пользователем несущие), которые работали иногда. Кажется, он работает все время локально, с файловым хранилищем, но прерывистым при использовании тумана и s3.
В сообщении почтовый список Я нашел этот код:
user.avatar = image.content.file
который снова работал иногда.
До сих пор мое рабочее решение:
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
который не только уродлив, но и не проходит проверку расширения, поскольку открытие удаленного файла не поддерживает расширение (jpg, png и т.д.).
Возможно, один из способов сделать это - установить URL удаленного изображения в соответствии с документацией о драгоценности Carrierwave?
user.remote_avatar_url = image.url
Из рассмотренных здесь решений я создал простой экземпляр CopyCarrierwaveFile, чтобы сделать это
используется примерно так:
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
Мне нужно было скопировать ссылку с одной модели на другую модель, и я был в состоянии сделать это, выполнив следующие действия:
my_new_model.update_column('attachment', my_other_model.attributes["attachment"]);
В этом сценарии я не хотел делать копию файла, и мне не хотелось, чтобы 2 записи были связаны с одним и тем же файлом (моя система никогда не удаляет или не изменяет файлы после загрузки).
Это может быть полезно для всех, кто хочет просто скопировать ссылку на файл с одной модели на другую, используя тот же загрузчик.
Здесь (хотя и хакерское) решение для этого не требует HTTP-запроса для извлечения изображения:
module UploadCopier
def self.copy(old, new)
new.instance_variable_set('@_mounters', nil)
old.class.uploaders.each do |column, uploader|
new.send("#{column}=", old.send(column))
end
end
end
old_user = User.last
new_user = User.new
UploadCopier.copy(old_user, new_user)
new_user.save
Я просто хотел скопировать аватар ссылку с одного объекта на другой, и для меня это было:
objectB.avatar.retrieve_from_store!(objectA.avatar.identifier)
objectB.save