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