diff --git a/lib/carrierwave/orm/activerecord.rb b/lib/carrierwave/orm/activerecord.rb index b23df2ce2..af4bceb71 100644 --- a/lib/carrierwave/orm/activerecord.rb +++ b/lib/carrierwave/orm/activerecord.rb @@ -52,13 +52,13 @@ def mount_base(column, uploader=nil, options={}, &block) validates_processing_of column if uploader_option(column.to_sym, :validate_processing) validates_download_of column if uploader_option(column.to_sym, :validate_download) - after_save :"store_#{column}!" before_save :"write_#{column}_identifier" + after_save :"store_previous_changes_for_#{column}" after_commit :"remove_#{column}!", :on => :destroy after_commit :"mark_remove_#{column}_false", :on => :update - - after_save :"store_previous_changes_for_#{column}" after_commit :"remove_previously_stored_#{column}", :on => :update + after_commit :"store_#{column}!", :on => [:create, :update] + class_eval <<-RUBY, __FILE__, __LINE__+1 def #{column}=(new_file) diff --git a/spec/orm/activerecord_spec.rb b/spec/orm/activerecord_spec.rb index 965122cd8..4b1947954 100644 --- a/spec/orm/activerecord_spec.rb +++ b/spec/orm/activerecord_spec.rb @@ -648,6 +648,7 @@ def filename end after do + FileUtils.rm_rf(public_path("uploads")) FileUtils.rm_rf(file_path("uploads")) end @@ -735,6 +736,7 @@ def filename end after do + FileUtils.rm_rf(public_path("uploads")) FileUtils.rm_rf(file_path("uploads")) end @@ -758,7 +760,6 @@ def filename Event.transaction do @event.image = stub_file('new.jpeg') @event.save - expect(File.exist?(public_path('uploads/new.jpeg'))).to be_truthy expect(File.exist?(public_path('uploads/old.jpeg'))).to be_truthy raise ActiveRecord::Rollback end @@ -766,6 +767,46 @@ def filename end end + describe "#mount_uploader into transaction" do + before do + @uploader.version :thumb + reset_class("Event") + Event.mount_uploader(:image, @uploader) + @event = Event.new + end + + after do + FileUtils.rm_rf(public_path("uploads")) + FileUtils.rm_rf(file_path("uploads")) + end + + it "should not store file during rollback" do + Event.transaction do + @event.image = stub_file('new.jpeg') + @event.save + + raise ActiveRecord::Rollback + end + + expect(File.exist?(public_path('uploads/new.jpeg'))).to be_falsey + end + + it "should not change file during rollback" do + @event.image = stub_file('old.jpeg') + @event.save + + Event.transaction do + @event.image = stub_file('new.jpeg') + @event.save + + raise ActiveRecord::Rollback + end + + expect(File.exist?(public_path('uploads/new.jpeg'))).to be_falsey + expect(File.exist?(public_path('uploads/old.jpeg'))).to be_truthy + end + end + describe '#mount_uploader removing old files with multiple uploaders' do before do @uploader = Class.new(CarrierWave::Uploader::Base) @@ -783,6 +824,7 @@ def filename end after do + FileUtils.rm_rf(public_path("uploads")) FileUtils.rm_rf(file_path("uploads")) end @@ -826,6 +868,7 @@ def filename end after do + FileUtils.rm_rf(public_path("uploads")) FileUtils.rm_rf(file_path("uploads")) end @@ -1367,6 +1410,7 @@ def filename end after do + FileUtils.rm_rf(public_path("uploads")) FileUtils.rm_rf(file_path("uploads")) end @@ -1444,6 +1488,7 @@ def filename end after do + FileUtils.rm_rf(public_path("uploads")) FileUtils.rm_rf(file_path("uploads")) end @@ -1481,6 +1526,7 @@ def filename end after do + FileUtils.rm_rf(public_path("uploads")) FileUtils.rm_rf(file_path("uploads")) end @@ -1523,6 +1569,7 @@ def filename end after do + FileUtils.rm_rf(public_path("uploads")) FileUtils.rm_rf(file_path("uploads")) end