Можно ли создать вставку для нескольких загруженных файлов в модель has_one_attached с активным хранилищем? - PullRequest
0 голосов
/ 24 мая 2019

Я хочу иметь возможность загружать сразу несколько аудиофайлов в форму, а затем создавать в моей модели новую строку для каждого файла, а также связанную с ним запись вложения / активной памяти.Но таблица имеет 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

Пока:

  1. Мне удалось загрузить один файл с успехом.

  2. Мне удалось загрузить несколько файлов с помощью has_many_attached и «множественного числа: правда», но тогда я получаю только одну строку в Trackaudios.

  3. Когда я попытался использовать 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}]}
...