From 836eb915b14f01eca8a5ea655e4f30b6a8a7ce38 Mon Sep 17 00:00:00 2001 From: George Claghorn Date: Thu, 15 Aug 2019 16:36:34 -0400 Subject: [PATCH] Fix attaching many uploaded files one at a time Closes #36806. --- .../attached/changes/delete_many.rb | 4 ++++ .../lib/active_storage/attached/many.rb | 2 +- .../test/models/attached/many_test.rb | 21 +++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/activestorage/lib/active_storage/attached/changes/delete_many.rb b/activestorage/lib/active_storage/attached/changes/delete_many.rb index 6cbd1158dc..804b8671c0 100644 --- a/activestorage/lib/active_storage/attached/changes/delete_many.rb +++ b/activestorage/lib/active_storage/attached/changes/delete_many.rb @@ -8,6 +8,10 @@ module ActiveStorage @name, @record = name, record end + def attachables + [] + end + def attachments ActiveStorage::Attachment.none end diff --git a/activestorage/lib/active_storage/attached/many.rb b/activestorage/lib/active_storage/attached/many.rb index 25f88284df..660b6a617c 100644 --- a/activestorage/lib/active_storage/attached/many.rb +++ b/activestorage/lib/active_storage/attached/many.rb @@ -31,7 +31,7 @@ module ActiveStorage if record.persisted? && !record.changed? record.update(name => blobs + attachables.flatten) else - record.public_send("#{name}=", blobs + attachables.flatten) + record.public_send("#{name}=", (change&.attachables || blobs) + attachables.flatten) end end diff --git a/activestorage/test/models/attached/many_test.rb b/activestorage/test/models/attached/many_test.rb index 39ddecb041..76e1d18b88 100644 --- a/activestorage/test/models/attached/many_test.rb +++ b/activestorage/test/models/attached/many_test.rb @@ -109,6 +109,27 @@ class ActiveStorage::ManyAttachedTest < ActiveSupport::TestCase assert_equal "video.mp4", @user.highlights.second.filename.to_s end + test "attaching new blobs from uploaded files to an existing, changed record one at a time" do + @user.name = "Tina" + assert @user.changed? + + @user.highlights.attach fixture_file_upload("racecar.jpg") + @user.highlights.attach fixture_file_upload("video.mp4") + assert_equal "racecar.jpg", @user.highlights.first.filename.to_s + assert_equal "video.mp4", @user.highlights.second.filename.to_s + assert_not @user.highlights.first.persisted? + assert_not @user.highlights.second.persisted? + assert @user.will_save_change_to_name? + assert_not ActiveStorage::Blob.service.exist?(@user.highlights.first.key) + assert_not ActiveStorage::Blob.service.exist?(@user.highlights.second.key) + + @user.save! + assert_equal "racecar.jpg", @user.highlights.reload.first.filename.to_s + assert_equal "video.mp4", @user.highlights.second.filename.to_s + assert ActiveStorage::Blob.service.exist?(@user.highlights.first.key) + assert ActiveStorage::Blob.service.exist?(@user.highlights.second.key) + end + test "attaching existing blobs to an existing record one at a time" do @user.highlights.attach create_blob(filename: "funky.jpg") @user.highlights.attach create_blob(filename: "town.jpg")