Подтвердить что ты не робот

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

Ошибка. Я просматривал веб-страницы и не смог найти решение.

4b9b3361

Ответ 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!

Попробуйте.