Вы должны выполнить 3 операции: получить содержимое URL, записать его на диск и прикрепить к вашей модели.
Получить содержимое URL
В Ruby есть различные библиотеки для обработки HTTP-запросов на получение.Конечно, есть стандартная библиотека Net :: HTTP и другие гемы клиента HTTP, как указано max .Я использовал некоторые из них, мой любимый выбор - http.rb , но вы можете выбрать все, что захотите.
Записать поток на диск
Вы должны выбрать папку ивведите имя файла и напишите поток.
Прикрепите данные к модели
Также есть несколько драгоценных камней для работы с вложениями .Если вы предпочитаете ActiveStorage , вы можете проверить метод attach
Наивная реализация может выглядеть так:
# You can use and other HTTP gem or standard Net::HTTP
gem 'http'
require 'http'
url = 'https://www.ruby-lang.org/images/header-ruby-logo.png'
# You can set timeouts and other options here
response = HTTP.follow(max_hops: 2).get(url)
# You can check for statuses or other responses
return if response.status != 200 || response.content_type.nil?
# You can grab filename from url or set another filename
filename = SecureRandom.hex
path = File.join('tmp', filename)
# Write stream somewhere
file = File.open(path, 'wb')
response.body.each do |chunk|
file.write(chunk)
end
# Suppose you use ActiveStorage, you can use the `attach` method
your_model.you_attribute.attach(
io: File.open(path),
filename: filename,
content_type: response.content_type.mime_type
)