Skip to content

Commit

Permalink
Fix attaching many uploaded files one at a time
Browse files Browse the repository at this point in the history
Closes #36806.
  • Loading branch information
georgeclaghorn committed Aug 15, 2019
1 parent f61542c commit 836eb91
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 1 deletion.
Expand Up @@ -8,6 +8,10 @@ def initialize(name, record)
@name, @record = name, record
end

def attachables
[]
end

def attachments
ActiveStorage::Attachment.none
end
Expand Down
2 changes: 1 addition & 1 deletion activestorage/lib/active_storage/attached/many.rb
Expand Up @@ -31,7 +31,7 @@ def attach(*attachables)
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

Expand Down
21 changes: 21 additions & 0 deletions activestorage/test/models/attached/many_test.rb
Expand Up @@ -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")
Expand Down

0 comments on commit 836eb91

Please sign in to comment.