Как обновить аватар / фото модели напрямую?

Это рельсы 3.0.x. Мне было просто интересно, как обновить атрибут фотографии / аватара модели напрямую, не предлагая пользователю загружать данные из его / ее системы?

Я использую Скрепку, чтобы прикрепить фотографию к модели; Он имеет расширение, так что пользователь может использовать URL-адрес для загрузки фотографии. Это работает.

Теперь я посмотрел Canvas2Image, и он возвращает изображение холста, чтобы пользователь мог загрузить их.

Мне было интересно, как использовать URL, который возвращает Canvas2Image, чтобы я мог напрямую обновить фотографию текущей модели?

На данный момент у меня есть эта форма, которая предлагает пользователю обновить аватар / модель текущей модели:

<% form_for(@prototype,
            :url=>{:controller=>"prototypes",
            :action=>"update"}, 
            :html => { :multipart => true }) do |f| %>

    <%= f.file_field :avatar %><br><br>
    <%= f.text_field :image_url %><br><br>
    <%= submit_tag   "Save Prototype" %>

<% end %>

Любая помощь приветствуется, спасибо!

3 ответа

Решение

Из вашей ссылки на Canvas2Image выше мне кажется, что вы пытаетесь обрабатывать изображения в кодировке Base64 (например, data:image/octet-stream;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wB).

Скрепка ожидает Tempfile объект, который создается за кулисами для вас при загрузке изображения. Можно подделать Tempfile используя StringIO объект и добавление content_type а также original_filename методы экземпляра.

Я опубликовал суть кода, который использовал для этого в одном из моих проектов. https://gist.github.com/1012107.

Чтобы сделать что-то подобное, вам нужно удалить начальную часть URI Canvas2Image data:image/octet-stream;base64, и используйте оставшийся код Base64 в качестве image_data. Вам нужен способ предоставления или работы с типом содержимого и именем файла.

Если вы просто хотите использовать обычные URL, такие как http://example.com/image.jpg тогда у вас есть несколько доступных вариантов.

Вы можете просто сохранить URL и использовать его в качестве источника изображения на своих страницах. Я знаю, что это не всегда вариант, и вы не можете контролировать доступность изображения.

В противном случае есть несколько утилит, таких как net/http и curl, которые вы можете использовать для загрузки образа. Если вы думаете, что хотите пойти по этому пути, то вы можете также рассмотреть возможность загрузки изображений с использованием отложенных заданий или аналогичного фонового процесса. Таким образом, ваш интерфейс не зависает, если загрузка изображения происходит медленно.

Если вы хотите получить граватар, используя адрес электронной почты пользователя, вы можете использовать следующий фрагмент кода.

В помощник:

def avatar_url(user)    
 gravatar_id = Digest::MD5.hexdigest(user.email.downcase)
 return "http://gravatar.com/avatar/#{gravatar_id}.png?s=48&d=#{CGI.escape(default_url)}"         
end

По вашему мнению:

<%= link_to(image_tag(avatar_url(user)), user_path(user))%>

Это оно! Вам не нужно просить пользователя загрузить свою фотографию в вашу систему. Он покажет фотографию его граватар аккаунта. Пожалуйста, дайте мне знать, решит ли это вашу проблему.

Эта ссылка может быть то, что вы ищете

Однако, если вы еще не проделали большую работу со скрепкой, я бы порекомендовал вам перейти на CarrierWave. То же самое делается с двумя строками кода:

@prototype.image_remote_url = canvas2image_url #you should change this
@prototype.save
Другие вопросы по тегам