From f8ea35445e51c438b8cc8baf3e50079b5d423e34 Mon Sep 17 00:00:00 2001 From: Mitsuhiro Shibuya Date: Thu, 9 Feb 2023 14:50:22 +0900 Subject: [PATCH] Restore previous behavior of clearing attachments via attribute assignment Fixes #2654, Refs. #2613 --- lib/carrierwave/mount.rb | 16 ++++----------- lib/carrierwave/orm/activerecord.rb | 5 +++++ spec/orm/activerecord_spec.rb | 30 +++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/lib/carrierwave/mount.rb b/lib/carrierwave/mount.rb index bd604befe..36ebfdd58 100644 --- a/lib/carrierwave/mount.rb +++ b/lib/carrierwave/mount.rb @@ -174,12 +174,8 @@ def write_#{column}_identifier return if frozen? mounter = _mounter(:#{column}) - if mounter.remove? - mounter.clear! - write_uploader(mounter.serialization_column, nil) - elsif mounter.identifiers.first - write_uploader(mounter.serialization_column, mounter.identifiers.first) - end + mounter.clear! if mounter.remove? + write_uploader(mounter.serialization_column, mounter.identifiers.first) end def #{column}_identifier @@ -353,12 +349,8 @@ def write_#{column}_identifier return if frozen? mounter = _mounter(:#{column}) - if mounter.remove? - mounter.clear! - write_uploader(mounter.serialization_column, nil) - elsif mounter.identifiers.any? - write_uploader(mounter.serialization_column, mounter.identifiers) - end + mounter.clear! if mounter.remove? + write_uploader(mounter.serialization_column, mounter.identifiers.presence) end def #{column}_identifiers diff --git a/lib/carrierwave/orm/activerecord.rb b/lib/carrierwave/orm/activerecord.rb index 86d540576..fe1c82e13 100644 --- a/lib/carrierwave/orm/activerecord.rb +++ b/lib/carrierwave/orm/activerecord.rb @@ -91,6 +91,11 @@ def remove_#{column}=(value) result end + def write_#{column}_identifier + return unless has_attribute?(_mounter(:#{column}).serialization_column) + super + end + # Reset cached mounter on record reload def reload(*) @_mounters = nil diff --git a/spec/orm/activerecord_spec.rb b/spec/orm/activerecord_spec.rb index ede9dd7de..db2da86d5 100644 --- a/spec/orm/activerecord_spec.rb +++ b/spec/orm/activerecord_spec.rb @@ -681,6 +681,21 @@ def filename end end + + describe 'calling #update! on the instance' do + before do + @event.image = stub_file('test.jpeg') + @event.save! + @event.reload + end + + it "allows clearing the stored image" do + @event.update!(image: nil) + expect(@event.image.file).to be_nil + expect(File.exist?(public_path('uploads/test.jpeg'))).to be_falsy + expect(@event[:image]).to be_nil + end + end end describe '#mount_uploader with mount_on' do @@ -1509,6 +1524,21 @@ def filename end end + + describe 'calling #update! on the instance' do + before do + @event.images = [stub_file('test.jpeg')] + @event.save! + @event.reload + end + + it "allows clearing the stored images" do + @event.update!(images: []) + expect(@event.images).to be_empty + expect(File.exist?(public_path('uploads/test.jpeg'))).to be_falsy + expect(@event[:images]).to be nil + end + end end describe '#mount_uploaders with mount_on' do