diff --git a/lib/paper_trail.rb b/lib/paper_trail.rb index fb2dc1a2..8f0e78aa 100644 --- a/lib/paper_trail.rb +++ b/lib/paper_trail.rb @@ -32,6 +32,16 @@ module PaperTrail !!paper_trail_store[:request_enabled_for_controller] end + # Sets whether PaperTrail is enabled or disabled for this model in the current request. + def self.enabled_for_model(model, value) + paper_trail_store[:"request_enabled_for_#{model}"] = value + end + + # Returns `true` if PaperTrail is enabled for this model in the current request, `false` otherwise. + def self.enabled_for_model?(model) + !!paper_trail_store.fetch(:"request_enabled_for_#{model}", true) + end + # Set the field which records when a version was created. def self.timestamp_field=(field_name) PaperTrail.config.timestamp_field = field_name diff --git a/lib/paper_trail/has_paper_trail.rb b/lib/paper_trail/has_paper_trail.rb index 78efdbfc..96f5ddd3 100644 --- a/lib/paper_trail/has_paper_trail.rb +++ b/lib/paper_trail/has_paper_trail.rb @@ -54,9 +54,6 @@ module PaperTrail paper_trail_options[:meta] ||= {} - class_attribute :paper_trail_enabled_for_model - self.paper_trail_enabled_for_model = true - class_attribute :versions_association_name self.versions_association_name = options[:versions] || :versions @@ -81,7 +78,7 @@ module PaperTrail # Switches PaperTrail off for this class. def paper_trail_off! - self.paper_trail_enabled_for_model = false + PaperTrail.enabled_for_model(self, false) end def paper_trail_off @@ -91,14 +88,18 @@ module PaperTrail # Switches PaperTrail on for this class. def paper_trail_on! - self.paper_trail_enabled_for_model = true + PaperTrail.enabled_for_model(self, true) end - def paper_trail_on + def paper_trail_on warn "DEPRECATED: use `paper_trail_on!` instead of `paper_trail_on`. Support for `paper_trail_on` will be removed in PaperTrail 3.1" self.paper_trail_on! end + def paper_trail_enabled_for_model? + PaperTrail.enabled_for_model?(self) + end + def paper_trail_version_class @paper_trail_version_class ||= version_class_name.constantize end @@ -204,7 +205,7 @@ module PaperTrail # Executes the given method or block without creating a new version. def without_versioning(method = nil) - paper_trail_was_enabled = self.paper_trail_enabled_for_model + paper_trail_was_enabled = self.class.paper_trail_enabled_for_model? self.class.paper_trail_off! method ? method.to_proc.call(self) : yield ensure @@ -333,7 +334,7 @@ module PaperTrail end def paper_trail_switched_on? - PaperTrail.enabled? && PaperTrail.enabled_for_controller? && self.paper_trail_enabled_for_model + PaperTrail.enabled? && PaperTrail.enabled_for_controller? && self.class.paper_trail_enabled_for_model? end def save_version? diff --git a/test/functional/thread_safety_test.rb b/test/functional/thread_safety_test.rb index 21bb1989..908f0f2b 100644 --- a/test/functional/thread_safety_test.rb +++ b/test/functional/thread_safety_test.rb @@ -1,7 +1,7 @@ require 'test_helper' class ThreadSafetyTest < ActionController::TestCase - test "be thread safe" do + test "be thread safe when using #set_paper_trail_whodunnit" do blocked = true slow_thread = Thread.new do @@ -23,4 +23,26 @@ class ThreadSafetyTest < ActionController::TestCase assert_not_equal slow_thread.value, fast_thread.value end + + test "be thread safe when using #without_versioning" do + enabled = nil + + slow_thread = Thread.new do + Widget.new.without_versioning do + sleep(0.01) + enabled = Widget.paper_trail_enabled_for_model? + sleep(0.01) + end + enabled + end + + fast_thread = Thread.new do + sleep(0.005) + Widget.paper_trail_enabled_for_model? + end + + assert_not_equal slow_thread.value, fast_thread.value + assert Widget.paper_trail_enabled_for_model? + assert PaperTrail.enabled_for_model?(Widget) + end end diff --git a/test/unit/model_test.rb b/test/unit/model_test.rb index 8a24f1c3..27983f47 100644 --- a/test/unit/model_test.rb +++ b/test/unit/model_test.rb @@ -495,7 +495,7 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase context 'when destroyed "without versioning"' do should 'leave paper trail off after call' do @widget.without_versioning :destroy - assert !Widget.paper_trail_enabled_for_model + assert !Widget.paper_trail_enabled_for_model? end end @@ -522,7 +522,7 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase end should 'enable paper trail after call' do - assert Widget.paper_trail_enabled_for_model + assert Widget.paper_trail_enabled_for_model? end end end