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

#ruby-on-rails #ruby-on-rails-3 #paperclip #ruby-on-rails-plugins

#ruby-on-rails #ruby-on-rails-3 #скрепка #ruby-on-rails-плагины

Вопрос:

Это rails 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 %>
  

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

Ответ №1:

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

Paperclip ожидает 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, которые вы могли бы использовать для загрузки изображения. Если вы считаете, что хотите пойти по этому пути, вы также можете рассмотреть возможность загрузки изображений с использованием отложенных заданий или аналогичного фонового процесса. Таким образом, ваш пользовательский интерфейс не зависает, если загрузка изображения происходит медленно.

Комментарии:

1. Это имеет отношение к моему вопросу. Мне было интересно, что вы имели в виду под типом содержимого и именем файла? Тип контента, как в, PNG, JPG и т.д.? Имя файла, как в коде, должно указывать одно вместо данных изображения в качестве имени? Приветствия.

2. Да, тип содержимого в формате PNG, JPG и т.д.

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

4. По вашей сути, предполагается ли, что все проходящие изображения закодированы в Base64?

5. Нет, обычная загрузка файлов тоже работает. На самом деле приложение, из которого я извлек пример, использует оба метода. Обычная загрузка файла используется для веб-интерфейса, а метод Base64 используется для JSON API, чтобы пользователи могли загружать фотографии из приложения для iPhone.

Ответ №2:

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

В помощнике:

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

На ваш взгляд:

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

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

Комментарии:

1. Привет, Фуад! Это замечательно для профиля моего пользователя. Однако прямо сейчас это не то, что я ищу. У моих пользователей есть много прототипов (отношение has_many), и к этим прототипам прикреплено изображение! Просто интересно, как я могу позволить пользователям редактировать эти изображения через холст и сохранять их непосредственно на сервер. (Моя конечная цель)

Ответ №3:

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

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

 @prototype.image_remote_url = canvas2image_url #you should change this
@prototype.save
  

Комментарии:

1. Эй, баснек! Спасибо, что ответили. Я уже внедрил эту функцию с помощью Paperclip (я упоминал «пользователь может использовать URL для загрузки фотографии»). Тем не менее, он просит пользователя указать URL для изображения. Я спрашивал, как это сделать, используя изображение, предоставленное Canvas2Image (посмотрите на мою ссылку для демонстрации). Где пользователь рисует на холсте, преобразует его в изображение и нажимает кнопку, чтобы перезаписать текущее изображение прототипа!