CarrierWave, как хранить файл по указанному URL-адресу
У меня есть CarrierWave, работающий нормально через типичную настройку ORM и загрузку через форму. Я хотел бы выяснить, как использовать CarrierWave вне контекста представления формы. Например, когда пользователь регистрируется, я хотел бы захватить их gravatar и сохранить его с CarrierWave. Вот что у меня есть, и он не работает:
gravatar_url = "http://www.gravatar.com/avatar/#{Digest::MD5.new.update(current_user.email)}?s=512&d=identicon"
uploader = ImageUploader.new
uploader.store! gravatar_url
Ошибка. Я просматривал веб-страницы и не смог найти решение.
Ответы
Ответ 1
У меня было много проблем, пытаясь понять, как получить store!
для работы с локальными путями файлов. Оказывается, что store!
фактически принимает файл как параметр, а не строку.
Для URL-адреса вам нужно сначала require 'open-uri'
, затем откройте файл /url. Что-то вроде этого должно работать:
require 'open-uri'
gravatar_url = "http://www.gravatar.com/avatar/#{Digest::MD5.new.update(current_user.email)}?s=512&d=identicon"
tempfile = open(gravatar_url)
uploader = ImageUploader.new
uploader.store! tempfile
То же самое будет работать с файловым путем, но в этом случае вам не нужно требовать open-uri
.
Ответ 2
в контроллере после регистрации пользователя (если ваше поле изображения пользователя называется просто "образ" )
gravatar_url = "http://www.gravatar.com/avatar/#{Digest::MD5.new.update(current_user.email)}?s=512&d=identicon"
@user.remote_image_url = gravatar_url
@user.save
Я думаю, что это лучший способ в соответствии с документами несущей волны и некоторыми поисками.
наслаждайтесь!
Ответ 3
На самом деле вы можете сделать это, используя встроенное свойство remote_{attribute}_url
, если вы используете активные помощники записи/модели (подробности см. в CarrierWave railscast). Тем не менее, я немного искал в исходном коде, чтобы увидеть, как это работает, и кажется, что даже если вы этого не сделаете, вы должны использовать следующее:
uploader = ImageUploader.new
uploader.download! some_remote_url
uploader.store!
Попробуйте.