Skip to content

Commit 63113e9

Browse files
committed
Fix failing to remove files with ActiveRecord 7.1 after_commit order change enabled
Fixes #2713
1 parent 5316b35 commit 63113e9

File tree

2 files changed

+55
-6
lines changed

2 files changed

+55
-6
lines changed

lib/carrierwave/orm/activerecord.rb

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,16 @@ def mount_base(column, uploader=nil, options={}, &block)
2424

2525
after_save :"store_#{column}!"
2626
before_save :"write_#{column}_identifier"
27+
if ::ActiveRecord.try(:run_after_transaction_callbacks_in_order_defined)
28+
after_commit :"remove_previously_stored_#{column}", :on => :update
29+
after_commit :"reset_previous_changes_for_#{column}"
30+
after_commit :"mark_remove_#{column}_false", :on => :update
31+
else
32+
after_commit :"mark_remove_#{column}_false", :on => :update
33+
after_commit :"reset_previous_changes_for_#{column}"
34+
after_commit :"remove_previously_stored_#{column}", :on => :update
35+
end
2736
after_commit :"remove_#{column}!", :on => :destroy
28-
after_commit :"mark_remove_#{column}_false", :on => :update
29-
30-
after_commit :"reset_previous_changes_for_#{column}"
31-
after_commit :"remove_previously_stored_#{column}", :on => :update
3237
after_rollback :"remove_rolled_back_#{column}"
3338

3439
mod = Module.new

spec/orm/activerecord_spec.rb

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -775,8 +775,6 @@ def filename
775775
describe '#mount_uploader removing old files' do
776776
before do
777777
reset_class("Event")
778-
Event.mount_uploader(:image, @uploader)
779-
@event = Event.new
780778
end
781779

782780
after do
@@ -785,6 +783,8 @@ def filename
785783

786784
describe 'normally' do
787785
before do
786+
Event.mount_uploader(:image, @uploader)
787+
@event = Event.new
788788
@event.image = stub_file('old.jpeg')
789789

790790
expect(@event.save).to be_truthy
@@ -837,6 +837,8 @@ def filename
837837

838838
describe 'with an overridden filename' do
839839
before do
840+
Event.mount_uploader(:image, @uploader)
841+
@event = Event.new
840842
@uploader.class_eval do
841843
def filename
842844
model.foo + File.extname(super)
@@ -865,6 +867,48 @@ def filename
865867
expect(File.exist?(public_path('uploads/test.jpeg'))).to be_falsey
866868
end
867869
end
870+
871+
describe 'with after_commit callbacks invoked by defined order' do
872+
before do
873+
ActiveRecord.run_after_transaction_callbacks_in_order_defined = true if ActiveRecord.respond_to?(:run_after_transaction_callbacks_in_order_defined=)
874+
Event.mount_uploader(:image, @uploader)
875+
@event = Event.new
876+
@event.image = stub_file('old.jpeg')
877+
878+
expect(@event.save).to be_truthy
879+
expect(File.exist?(public_path('uploads/old.jpeg'))).to be_truthy
880+
end
881+
882+
after do
883+
ActiveRecord.run_after_transaction_callbacks_in_order_defined = false if ActiveRecord.respond_to?(:run_after_transaction_callbacks_in_order_defined=)
884+
end
885+
886+
it "should invoke the callbacks in correct order" do
887+
@event.image = stub_file('new.jpeg')
888+
expect(@event).to receive(:remove_previously_stored_image).ordered.and_call_original
889+
expect(@event).to receive(:reset_previous_changes_for_image).ordered.and_call_original
890+
expect(@event).to receive(:mark_remove_image_false).ordered.and_call_original
891+
@event.save
892+
end
893+
894+
it "should remove old file on replace" do
895+
@event.image = stub_file('new.jpeg')
896+
expect(@event.save).to be_truthy
897+
expect(File.exist?(public_path('uploads/new.jpeg'))).to be_truthy
898+
expect(File.exist?(public_path('uploads/old.jpeg'))).to be_falsey
899+
end
900+
901+
it "should remove the file when remove_image is set to true" do
902+
@event.remove_image = true
903+
expect(@event.save).to be_truthy
904+
expect(File.exist?(public_path('uploads/old.jpeg'))).to be_falsey
905+
end
906+
907+
it "should remove old file on destroy" do
908+
expect(@event.destroy).to be_truthy
909+
expect(File.exist?(public_path('uploads/old.jpeg'))).to be_falsey
910+
end
911+
end
868912
end
869913

870914
describe '#mount_uploader removing old files with versions' do

0 commit comments

Comments
 (0)