My opinionated ruby on rails template
1# frozen_string_literal: true
2
3say 'Setting up Paper Trail for audit logging...', :green
4
5gem 'paper_trail'
6
7say ' Creating initializer...', :cyan
8file 'config/initializers/paper_trail.rb', <<~RUBY
9 PaperTrail.config.enabled = true
10 PaperTrail.config.has_paper_trail_defaults = {
11 on: %i[create update destroy]
12 }
13 PaperTrail.config.version_limit = nil
14RUBY
15
16say ' Creating Auditable concern...', :cyan
17file 'app/models/concerns/auditable.rb', <<~RUBY
18 # frozen_string_literal: true
19
20 module Auditable
21 extend ActiveSupport::Concern
22
23 included do
24 has_paper_trail
25 end
26
27 def audit_trail
28 versions.order(created_at: :desc)
29 end
30
31 def last_modified_by
32 versions.last&.whodunnit
33 end
34 end
35RUBY
36
37say ' Setting up whodunnit tracking...', :cyan
38file 'app/controllers/concerns/set_paper_trail_whodunnit.rb', <<~RUBY
39 # frozen_string_literal: true
40
41 module SetPaperTrailWhodunnit
42 extend ActiveSupport::Concern
43
44 included do
45 before_action :set_paper_trail_whodunnit
46 end
47
48 private
49
50 def user_for_paper_trail
51 current_user&.id&.to_s || 'system'
52 end
53 end
54RUBY
55
56say ' Adding to ApplicationController...', :cyan
57inject_into_class 'app/controllers/application_controller.rb', 'ApplicationController', <<~RUBY
58 include SetPaperTrailWhodunnit
59RUBY
60
61after_bundle do
62 say ' Running Paper Trail install generator...', :cyan
63 rails_command 'generate paper_trail:install'
64end
65
66say 'Paper Trail audit logging configured!', :green
67say ' Include `Auditable` in models you want to track', :cyan