risentveber
@risentveber
fullstack web developer

Как правильно делать бэкенд для формы, которая предоставляет возможность привязки нескольких файлов к создаваемому объекту с их предпросмотром?

Вот то, до чего додумался сам - но думаю существую более элегантные варианты:
Скажем есть некоторый Material(ну не избитый же Post), к которому крепятся файлы(Attachment)
class Material < ActiveRecord::Base
  has_many :attachments, as: :attachable, dependent: :destroy
end

В качестве Uploader'а используется стандартно сгенерированный c помощью Carrierwave
class Attachment < ActiveRecord::Base
  belongs_to :attachable, polymorphic: true
  mount_uploader :file, FileUploader
end


Создание самих аттачментов происходит с помощью AJAX, который с помощью
соответствующего действия контроллера создает Attachement и получает взамен id и url файла .
class AttachmentsController < ApplicationController
  def create
    @a = Attachment.new(file: params[:file])
    if @a.save
      render 'create.json', layout: false
    else
      render json: {error: 'ERROR'}
    end
  end
end

Так выглядит JSON шаблон для ответа:
elem_id = "attachment" + @a.id.to_s
json.id @a.id
json.link @a.file.url
json.remove_link (link_to '×', attachment_path(@a),
  method: :delete, remote: true, id: elem_id, class: 'X18')
json.type @a.type
json.name truncate(@a.file.file.filename, length: 20)


А так само создание Material
class MaterialsController < ApplicationController
  def create
    @material = Material.new do |m|
      m.description = params[:description]
      m.user = current_user
      m.subject_id = params[:tag]
    end
    @material.save!

    @material.classrooms << Classroom.find(params[:classroom_id])

    @files = params[:attached_files]
    @files = @files.to_s.squish.split(" ")

    Attachment.find(@files).each do |f|
      f.attachable = @material
      f.save!
    end
  end
end


Подскажите пожалуйста, есть ли какие способы сделать данную функциональность лучше, скажем непосредственно с помощью временных файлов, которые будут удаляться в случае не создания пользователем материала, к которому они должны были привязываться?
  • Вопрос задан
  • 263 просмотра
Пригласить эксперта
Ответы на вопрос 1
@CapeRatel
Аплоадеры:
https://github.com/tors/jquery-fileupload-rails
https://github.com/ncuesta/dropzonejs-rails

Чтобы работал предпросмотр фото при загрузке, можно просто использовать js и html5. Надо загуглить чтото в стиле этого:
image preview before upload


Если вы хотите решение, чтобы файлы все таки загружались, то лучше юзать whenever и чистить картинки без привязки, как вам посоветовал FanKiLL
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы