Вот то, до чего додумался сам - но думаю существую более элегантные варианты:
Скажем есть некоторый 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
Подскажите пожалуйста, есть ли какие способы сделать данную функциональность лучше, скажем непосредственно с помощью временных файлов, которые будут удаляться в случае не создания пользователем материала, к которому они должны были привязываться?