Если вы используете ActiveStorage (что я бы порекомендовал), вы можете использовать .attach
, чтобы присоединить поток ввода-вывода к записи.
Дано:
class Download < ApplicationRecord
has_one_attached :image
end
С консоли rails вы можете скачать файл и прикрепить его с помощью:
require 'open-uri'
uri = 'http://www.shopprod.com/assets/photos/ishop-718755d2bc62956994c867681b2622e77b4c9af3d1ecd6fa856127b704a459b2.png'
download = Download.new
download.image.attach(io: open(uri), filename: uri.split('/').last)
Тем не менее, вы не можете просто так бросить его в свой модельный класс и ожидать, что оно сработает. Тело класса выполняется, когда класс читается.
Вместо этого вам нужно поместить его в метод и вызвать его в правильной точке.
class Download < ApplicationRecord
has_one_attached :image
def download_image!
require 'open-uri'
image.attach(
io: open(self.image_url),
filename: self.image_url.split('/').last
)
end
end
class DownloadsController < ApplicationController
def create
@download = Download.new(download_params)
if !@download.image.attached? && @download.image_url
@download.download_image!
# @todo handle errors
end
if @download.save
redirect_to @download
else
render :new
end
end
def download_params
params.require(:download)
.permit(:image, :image_url)
end
end