CarrierWave, как сохранить файл по указанному URL - PullRequest
20 голосов
/ 07 сентября 2011

У меня CarrierWave работает нормально через обычную настройку ORM и загружается через форму.Я хотел бы выяснить, как использовать CarrierWave вне контекста отправки формы.Например, когда пользователь регистрируется, я хотел бы захватить его граватар и сохранить его с 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

Никаких ошибок тоже нет.Я искал в Интернете и не смог найти решение.

Ответы [ 3 ]

45 голосов
/ 21 октября 2012

в контроллере после регистрации пользователя (при условии, что ваше поле изображения пользователя называется просто 'изображение')

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 

Я думаю, что это лучший способ, согласно документация на носителях и некоторые поиски.

наслаждаться!

19 голосов
/ 28 июля 2012

На самом деле вы можете сделать это, используя встроенное свойство remote_{attribute}_url, если вы используете активные помощники записи / модели (подробности см. В CarrierWave railscast). Тем не менее, я немного покопался в исходном коде, чтобы увидеть, как это на самом деле работает, и кажется, что даже если вы этого не сделаете, вы сможете использовать следующее:

uploader = ImageUploader.new
uploader.download! some_remote_url
uploader.store!

Дайте ему попытку.

16 голосов
/ 22 сентября 2011

У меня было много проблем, пытаясь выяснить, как заставить 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 в этом случае.

...