From b84852ff91aa5fe489e0e0aa95a55867ba94ebd8 Mon Sep 17 00:00:00 2001 From: Wojtek Kruszewski Date: Thu, 19 Oct 2017 15:03:31 +0200 Subject: [PATCH] Print warning when PT cannot be loaded .. .. because rails is not loaded yet. In some situations, when loading PT, `::Rails` has been defined, perhaps by a library like rails-html-sanitizer, but rails itself has not been loaded yet. --- CHANGELOG.md | 3 ++- lib/paper_trail.rb | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13534a88..2fd8faa8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,8 @@ recommendations of [keepachangelog.com](http://keepachangelog.com/). ### Fixed -- None +- [#1003](https://github.com/airblade/paper_trail/pull/1003) - Warn when PT + cannot be loaded because rails is not loaded yet. ## 8.0.0 (2017-10-04) diff --git a/lib/paper_trail.rb b/lib/paper_trail.rb index 2eb86847..85b08fe2 100644 --- a/lib/paper_trail.rb +++ b/lib/paper_trail.rb @@ -14,6 +14,12 @@ require "paper_trail/serializers/yaml" # An ActiveRecord extension that tracks changes to your models, for auditing or # versioning. module PaperTrail + E_RAILS_NOT_LOADED = <<-EOS.squish.freeze + PaperTrail has been loaded too early, before rails is loaded. This can + happen when another gem defines the ::Rails namespace, then PT is loaded, + all before rails is loaded. You may want to reorder your Gemfile, or defer + the loading of PT by using `require: false` and a manual require elsewhere. + EOS E_TIMESTAMP_FIELD_CONFIG = <<-EOS.squish.freeze PaperTrail.timestamp_field= has been removed, without replacement. It is no longer configurable. The timestamp field in the versions table must now be @@ -190,8 +196,14 @@ ActiveSupport.on_load(:active_record) do end # Require frameworks -if defined?(::Rails) && ActiveRecord::VERSION::STRING >= "3.2" - require "paper_trail/frameworks/rails" +if defined?(::Rails) + # Rails module is sometimes defined by gems like rails-html-sanitizer + # so we check for presence of Rails.application. + if defined?(::Rails.application) + require "paper_trail/frameworks/rails" + else + ::Kernel.warn(::PaperTrail::E_RAILS_NOT_LOADED) + end else require "paper_trail/frameworks/active_record" end