Skip to content

Commit 2b41634

Browse files
author
Lorenzo Tello
committed
customize log entry bodies on a per field basis
1 parent 62dd19b commit 2b41634

File tree

1 file changed

+32
-9
lines changed

1 file changed

+32
-9
lines changed

lib/logga/active_record.rb

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,42 @@ module Logga
22
module ActiveRecord
33
extend ActiveSupport::Concern
44

5+
EXCLUDED_KEYS = [:created_at, :updated_at, :log, :sent_photos_chaser_email, :sent_after_sales_emails]
6+
EXCLUDED_KEYS_SUFFIXES = [:_id, :_filenames]
7+
8+
included do
9+
class_attribute :log_fields, instance_writer: false
10+
self.log_fields = {}
11+
end
12+
513
class_methods do
6-
def add_log_entries_for(*actions, to: :self)
14+
def add_log_entries_for(*actions, to: :self, fields: {})
715
after_create :log_model_creation if actions.include?(:create)
816
after_update :log_model_changes if actions.include?(:update)
917
define_method(:log_receiver) { to == :self ? self : send(to) }
18+
self.log_fields = fields
1019
end
1120
end
1221

1322
def log_model_creation
14-
body = "#{self.class} created"
23+
body_generator = ->(record) { default_creation_log_body(record) }
24+
body = log_fields.fetch(:created_at, body_generator).call(self)
1525
log_receiver.log_entries.create(author_data.merge(body: body))
1626
end
1727

1828
def log_model_changes
19-
field_changes = changes.except(:created_at, :updated_at, :log)
29+
field_changes = changes.reject do |k, _|
30+
EXCLUDED_KEYS.include?(k.to_sym) ||
31+
EXCLUDED_KEYS_SUFFIXES.any? { |suffix| k.to_s.end_with?(suffix.to_s) }
32+
end
2033
log_field_changes(field_changes)
2134
end
2235

2336
def log_field_changes(changes)
24-
changes.each { |field, values| log_field_change(field, *values) }
25-
end
26-
27-
def log_field_change(field, old_value, new_value)
28-
body = "changed #{field} from #{old_value} to #{new_value}"
37+
body_generator = ->(record, field, old_value, new_value) { default_change_log_body(record, field, old_value, new_value) }
38+
body = changes.inject([]) do |body, (field, (old_value, new_value))|
39+
body << log_fields.fetch(field.to_sym, body_generator).call(self, field, old_value, new_value)
40+
end.join('\n')
2941
log_receiver.log_entries.create(author_data.merge(body: body))
3042
end
3143

@@ -37,5 +49,16 @@ def author_data
3749
author_name: data[:name]
3850
}
3951
end
52+
53+
def default_creation_log_body(record)
54+
[
55+
"#{record.class.name.demodulize} created",
56+
("(#{record.state})" if record.try(:state))
57+
].compact.join(' ')
58+
end
59+
60+
def default_change_log_body(record, field, old_value, new_value)
61+
"#{record.class.name.demodulize} #{field} set to #{new_value}"
62+
end
4063
end
41-
end
64+
end

0 commit comments

Comments
 (0)