Я хочу иметь возможность загружать сразу несколько аудиофайлов в форму, а затем создавать в моей модели новую строку для каждого файла, а также связанную с ним запись вложения / активной памяти.Но таблица имеет has_one_attached в том смысле, что в ней никогда не должно быть более одного прикрепленного аудиофайла в строке.
Подробности о том, что я пробовал, и ошибка вывода из терминала приведены ниже:
ПРИМЕЧАНИЕ: новичок в рельсах и программировании
Использование следующих ресурсов для рекомендаций:
[Обзор EdgeGuides-Active Storage] https://edgeguides.rubyonrails.org/active_storage_overview.html
[GoRails-DirectUploads With ActiveStorage] https://www.youtube.com/watch?v=S-E2TNkXBV8&t=312s
Пока:
Мне удалось загрузить один файл с успехом.
Мне удалось загрузить несколько файлов с помощью has_many_attached и «множественного числа: правда», но тогда я получаю только одну строку в Trackaudios.
Когда я попытался использовать has_one_attached на модели со значением «множественное число: истина» в форме, я могу получить несколько файлов в активное хранилище, но при создании Trackadio происходит сбой, где я сейчас нахожусь.
Модель: Tracakaudio.rb
class Trackaudio < ApplicationRecord
has_one_attached :trackaudio_file
has_many :tracks
belongs_to :user
before_create :default_trackaudio_create
has_one_attached :trackaudio_file
validates :trackaudio_file, :audiolibraries_id, :presence => true
def default_trackaudio_create**
self.filename ||= File.basename(trackaudio_file.filename.to_s,
'*')
self.audiolibraries_id = params[:audiolibraries_id]
end
end
Вид: index.html.erb
<%= form_with(model: @trackaudio, id: "fileupload") do |form| %>
<%= form.hidden_field :track_id, :value => params[:track_id] %>
<%= label_tag :audiolibraries_id, "Library" %>
<%= collection_select(:trackaudio, :audiolibraries_id,
Audiolibrary.all, :id, :libraryname, prompt: true) %>
<%= file_field :trackaudio, :trackaudio_file, direct_upload:
true, multiple: true %>
<%= form.submit %>
Контроллер: Trackaudios_Controller.rb
class TrackaudiosController < ApplicationController
def create
@trackaudio = Trackaudio.create(trackaudio_params)
set_trackaudio
respond_to do |format|
if @trackaudio.save
format.html { render :template => 'trackaudios/index',
notice: 'Track was successfully created.'}
format.json { render :template => 'trackaudios/index',
status: :created, location: @trackaudio }
format.js
puts @trackaudio.errors.inspect
else
format.html { render :template => 'trackaudios/index',
notice: @trackaudio.errors, status:
:unprocessable_entity }
format.json { render json: @trackaudio.errors, status:
:unprocessable_entity }
format.js
puts @trackaudio.errors.inspect
end
end
def trackaudio_params
params.require(:trackaudio).
permit(:filename, :filetype, :audiolibraries_id,
:track_id, :price, :bpm, :keysig, :filepath,
:isfolder, trackaudio_file: []).
merge(user_id: current_user.id).
merge(track_id: params[:track_id])
end
end
Direct_Uploads.js
My Direct_Uploads.js является копией и вставкой из:
[EdgeGuides-Active Storage Overview] https://edgeguides.rubyonrails.org/active_storage_overview.html
Ожидаемый / желаемый результат - я могу добавить несколько файлов в форму, а затем для каждого файла создать одну запись в Trackaudio с однойсоответствующее активное хранилище.
Клеммный выход Вот сжатый вывод терминала, когдапопытка загрузки с двумя файлами: Work It Beat 01.aif и JUST_snare_ringer.wav
ActiveStorage::Blob Create (0.3ms) INSERT INTO
"active_storage_blobs" ("key", "filename",
"content_type", "byte_size", "checksum", "created_at") VALUES
($1, $2, $3, $4, $5, $6) RETURNING "id" [["key",
"W11XRpWtxCk1d6zgUwkeH5hk"], ["filename", "Work It Beat 01.aif"],
["content_type", "audio/aiff"], ["byte_size", 11128840],
["checksum", "+V0NcNz8B4Vp0L0mUeKbag=="], ["created_at", "2019-
05- 23 22:18:36.389558"]]
↳ /.rvm/gems/ruby-2.3.7/gems/activerecord-
5.2.3/lib/active_record/log_subscriber.rb:98
(3.4ms)
COMMIT
ActiveStorage::Blob Create (0.3ms) INSERT INTO
"active_storage_blobs" ("key", "filename", "content_type",
"byte_size", "checksum", "created_at") VALUES ($1, $2, $3, $4, $5,
$6) RETURNING "id" [["key", "DoT6X851zcWzr9BpjpeZhhNF"],
["filename", "JUST_snare_ringer.wav"], ["content_type",
"audio/wav"], ["byte_size", 45168], ["checksum",
"CLrvm71rPgnObYjMgyizMQ=="], ["created_at", "2019-05-23
22:18:36.546537"]]
↳ /.rvm/gems/ruby-2.3.7/gems/activerecord-
5.2.3/lib/active_record/log_subscriber.rb:98
(5.8ms) COMMIT
Started POST "/trackaudios" for ::1 at 2019-05-23 18:18:36 -0400
Processing by TrackaudiosController#create as JS
Parameters: {"utf8"=>"✓",
"authenticity_token"=>"bunch of characters", "track_id"=>"2",
"trackaudio"=>{"audiolibraries_id"=>"1", "trackaudio_file"=>[long
string, "another long string"]}, "commit"=>"Save "}
(0.2ms) BEGIN
↳ app/controllers/trackaudios_controller.rb:48
User Load (0.3ms) SELECT "users".* FROM "users" WHERE
"users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]]
↳ app/controllers/trackaudios_controller.rb:48
(0.3ms) ROLLBACK
↳ app/controllers/trackaudios_controller.rb:48
Track Load (0.4ms) SELECT "tracks".* FROM "tracks" WHERE
"tracks"."id" = $1 LIMIT $2 [["id", 2], ["LIMIT", 1]]
↳ app/controllers/trackaudios_controller.rb:108
(0.5ms) BEGIN
↳ app/controllers/trackaudios_controller.rb:51
(1.3ms) ROLLBACK
@messages={:trackaudio_file=>["can't be blank"]}, @details= .
{:trackaudio_file=>[{:error=>:blank}]}