Вложение файлов и обработка ошибок проверки с помощью Rails и Paperclip - PullRequest
3 голосов
/ 30 декабря 2011

У меня есть форма для отправки сообщения с вложениями.

  • Пользователь выбирает файлы для прикрепления
  • Нажмите «Отправить» и подождите (долгое время), пока все файлы не будут загружены
  • Пользователь забыл напечатать сообщение, поэтому проверка не удалась
  • Пользователь должен загрузить все файлы снова (долгое время)

Есть ли простой способ сделатьрельсы, чтобы запомнить уже загруженные файлы?(Я использовал скрепку)

Ответы [ 2 ]

1 голос
/ 30 декабря 2011

Одним из способов было бы создание объекта Message изначально со значениями по умолчанию (передача), когда вы начинаете загрузку файла, а затем просто выполните запрос PUT для обновления объекта сообщения, используя форму.

ЭтоТаким образом, объект Message действителен при создании, и единственное, что вы проверяете, это то, что информация об обновлении также действительна (если это не так, сообщение просто будет иметь значение по умолчанию, и пользователю не придется повторно-загрузите файл).

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

change_column_default(:messages, :content, "You have a new message!")
0 голосов
/ 19 мая 2014

Мне пришлось исправить это в недавнем проекте с использованием PaperClip. Это немного глупо, но это работает. Я попытался вызвать cache_images (), используя after_validation и before_save в модели, но по какой-то причине это не удалось создать, но я не могу определить это, поэтому я просто вызываю его из контроллера. Надеюсь, это сэкономит кому-то еще время!

модель:

class Shop < ActiveRecord::Base    
  attr_accessor :logo_cache

  has_attached_file :logo

  def cache_images
    if logo.staged?
      if invalid?
        FileUtils.cp(logo.queued_for_write[:original].path, logo.path(:original))
        @logo_cache = encrypt(logo.path(:original))
      end
    else
      if @logo_cache.present?
        File.open(decrypt(@logo_cache)) {|f| assign_attributes(logo: f)}
      end
    end
  end

  private

  def decrypt(data)
    return '' unless data.present?
    cipher = build_cipher(:decrypt, 'mypassword')
    cipher.update(Base64.urlsafe_decode64(data).unpack('m')[0]) + cipher.final
  end

  def encrypt(data)
    return '' unless data.present?
    cipher = build_cipher(:encrypt, 'mypassword')
    Base64.urlsafe_encode64([cipher.update(data) + cipher.final].pack('m'))
  end

  def build_cipher(type, password)
    cipher = OpenSSL::Cipher::Cipher.new('DES-EDE3-CBC').send(type)
    cipher.pkcs5_keyivgen(password)
    cipher
  end

end

Контроллер:

def create
  @shop = Shop.new(shop_params)
  @shop.user = current_user
  @shop.cache_images

  if @shop.save
    redirect_to account_path, notice: 'Shop created!'
  else
    render :new
  end
end

def update
  @shop = current_user.shop
  @shop.assign_attributes(shop_params)
  @shop.cache_images

  if @shop.save
    redirect_to account_path, notice: 'Shop updated.'
  else
    render :edit
  end
end

вид:

= f.file_field :logo
= f.hidden_field :logo_cache

- if @shop.logo.file?
  %img{src: @shop.logo.url, alt: ''}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...