Add immutable audit trails to your Ruby on Rails application with the AuditKit Ruby gem. ActiveRecord callbacks, controller concerns, and Sidekiq integration for background logging.
Ruby on Rails remains one of the most productive frameworks for building B2B SaaS applications. The AuditKit Ruby gem provides ActiveRecord callbacks for automatic model change tracking, controller concerns for request logging, and Sidekiq integration for non-blocking event delivery. The gem follows Rails conventions with generators, configuration initializers, and concern-based composition.
Add AuditKit to your Gemfile.
# Gemfile
gem 'auditkit'
# Then run:
bundle install
rails generate auditkit:installSet up AuditKit in the generated initializer.
# config/initializers/auditkit.rb
AuditKit.configure do |config|
config.api_key = ENV['AUDITKIT_API_KEY']
config.tenant_resolver = ->(request) { request.env['current_tenant']&.id }
config.async = true # Use Sidekiq for background delivery
endInclude the Auditable concern in your models.
class Document < ApplicationRecord
include AuditKit::Auditable
auditable fields: [:title, :status, :classification],
on: [:create, :update, :destroy]
endCapture explicit audit events in controllers or services.
class DocumentsController < ApplicationController
def approve
document = Document.find(params[:id])
document.update!(status: 'approved')
AuditKit.log(
action: 'document.approved',
actor: { id: current_user.id.to_s, email: current_user.email },
target: { type: 'document', id: document.id.to_s },
metadata: { title: document.title }
)
end
endHere is a complete example showing AuditKit integrated into a Ruby on Rails application with authentication logging, data access tracking, and explicit event capture.
# config/initializers/auditkit.rb
AuditKit.configure do |config|
config.api_key = ENV['AUDITKIT_API_KEY']
config.tenant_resolver = ->(request) { request.env['current_tenant']&.id }
config.async = true
end
# app/models/invoice.rb
class Invoice < ApplicationRecord
include AuditKit::Auditable
belongs_to :customer
auditable fields: [:amount, :status, :due_date], on: [:create, :update, :destroy]
end
# app/controllers/invoices_controller.rb
class InvoicesController < ApplicationController
include AuditKit::ControllerConcern
def create
@invoice = Invoice.create!(invoice_params)
head :created
end
def refund
@invoice = Invoice.find(params[:id])
previous_status = @invoice.status
@invoice.update!(status: 'refunded')
AuditKit.log(
action: 'invoice.refunded',
actor: { id: current_user.id.to_s, email: current_user.email },
target: { type: 'invoice', id: @invoice.id.to_s },
metadata: {
invoice_number: @invoice.number,
amount: @invoice.amount.to_s,
previous_status: previous_status,
}
)
head :ok
end
endAuditable concern for ActiveRecord model change tracking
ControllerConcern for automatic request logging
Sidekiq integration for non-blocking event delivery
Devise integration for authentication event capture
Pundit/CanCanCan integration for authorization logging
Multi-tenant support with Apartment or acts_as_tenant
Add the auditkit gem to your Gemfile, run the install generator, and configure your API key. Include AuditKit::Auditable in models for automatic change tracking, or call AuditKit.log() for explicit events.
Yes. The AuditKit gem integrates with Sidekiq for non-blocking event delivery. Set config.async = true in the initializer and events will be queued as Sidekiq jobs.
Get started with tamper-proof audit trails in minutes. Open source, from $99/mo.