Направляющие: Скрепка и предварительные просмотры?

Вы знаете на некоторых сайтах, когда Вас просят загрузить, скажем, аватар, Вы нажимаете на кнопку, выбираете Ваш файл, затем совершаете нападки хорошо, но Перед представлением страницы (как в, никакая запись не создается/обновляется), немного предварительного просмотра изображения обнаруживается?

Как я выполнил бы эту Скрепку использования для направляющих?

Бонусные очки для любого, кто может указать на меня к учебному руководству или чему-то, что могло бы сказать мне, как сделать обрезку JavaScript на изображении прежде, чем сохранить запись.

Я не был в состоянии найти много на Google на предмете... благодарит за справку!

18
задан neezer 9 February 2010 в 20:12
поделиться

1 ответ

Такие вещи проблематичны с точки зрения Rails из-за способа загрузка изображений работает. Один из способов улучшить его работу:

  • Создайте подформу для загрузки изображения, возможно, используя swfupload , чтобы сделать ее более упрощенной.
  • Создайте модель для получения ваших загрузок, которая включает некоторый ключ случайного доступа, используемый для ее получения и связывания. Скрепка обрабатывает прикрепленный файл.
  • Используйте AJAX для заполнения вашей основной формы, вставив скрытое поле или потенциально видимый элемент флажка с соответствующим unique_key, когда подчиненная форма завершится.

Типичная модель выглядит примерно так:

class Avatar < ActiveRecord::Base
  has_attached_file :image
  # ... Additional Paperclip options here

  before_validation :assign_unique_key

  belongs_to :user

  def to_param
    self.unique_key
  end

protected
  def assign_unique_key
    return if (self.unique_key.present?)

    self.unique_key = Digest::SHA1.hexdigest(ActiveSupport::SecureRandom.random_number(1<<512).to_s)
  end
end

Причина наличия поля unique_key в том, что вы можете связать его с формой потенциально несохраненной записи. Выгодно использовать unique_key вместо id при вводе его в URL-адреса, поскольку трудно сказать, должен ли пользователь видеть это изображение или нет, когда оно загружено, поскольку пользователь-владелец еще не может быть назначен.

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

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

Вы можете легко вырезать параметры при получении и преобразовать их обратно в ID-номера аватара:

# If an avatar_id parameter has been assigned...
if (params[:user][:avatar_id])
  # ...resolve this as if it were a unique_key value...
  avatar = Avatar.find_by_unique_key(params[:user][:avatar_id])
  # ...and repopulate the parameters if it has been found.
  params[:user][:avatar_id] = (avatar && avatar.id)
end

# ... params[:user] used as required for create or update

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

task :purge_orphan_avatars => :environment do
  # Clear out any Avatar records that have not been assigned to a particular
  # user within the span of two days.
  Avatar.destroy_all([ 'created_at<? AND user_id IS NULL', 2.days.ago ])
end

Использование destroy_all должно также привести к очистке всего материала скрепок.

19
ответ дан 30 November 2019 в 08:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: