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
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
summer Ярославль
от 100 000 до 140 000 ₽
КРАФТТЕК Санкт-Петербург
от 60 000 до 80 000 ₽
19 апр. 2024, в 14:12
30000 руб./за проект
19 апр. 2024, в 14:10
500 руб./за проект