Audited::ActiveJob
Audited::ActiveJob ties together activejob and audited to allow passing an optional audit_user through to your ActiveJob classes. It also wraps the execution of your MyJob#perform method with Audited.audit_class.as_user, which automatically associates any audits generated in your jobs to the audit_user you pass through (usually the user who triggered the job, if there is one).
In cases where you do not pass an audit_user argument to MyJob.perform_now or MyJob.perform_later (i.e. jobs queued up by automated processes) everything will behave as usual, and any generated audits will not have a user associated with them.
Getting Started
Just add the gem to your Gemfile and run bundle install:
gem 'audited-activejob'
Usage
audit_user
First, the gem provides an audit_user method to any jobs that include the Audited::ActiveJob mixin, which you can use however you like within your jobs. You can populate this when queueing up your job by passing an audit_user: user keyword argument. Note: You do not need to modify your job's MyJob#perform method to accept this extra argument.
class MyJob < ActiveJob::Base
include Audited::ActiveJob
queue_as :default
def perform
Rails.logger.info "Executed MyJob for #{audit_user.try(:email) || 'unknown'}"
end
end
# without a user
MyJob.perform_later
# writes "Executed MyJob for unknown" to the rails log
# with a user
MyJob.perform_later audit_user: User.find_by(email: 'mark@markrebec.com')
# writes "Executed MyJob for mark@markrebec.com" to the rails log
# if you're in a controller or some other context where you already have a current_user
# you'll probably just want to pass that through.
MyJob.perform_later audit_user: current_userAudits
Any job that includes the Audited::ActiveJob mixin will also have it's MyJob#perform method wrapped with Audited.audit_class.as_user(audit_user) in an around_perform block. This ensures that any audits generated during your job execution will be associated with the provided user.
class MyModel < ActiveRecord::Base
audited
# ...
end
class MyJob < ActiveJob::Base
include Audited::ActiveJob
queue_as :default
def perform(my_model)
my_model.update(foo: 'bar')
end
end
# creates all audits without an associated user
MyJob.perform_later MyModel.find(1)
# associates all created audits with the provided user
MyJob.perform_later MyModel.find(1), audit_user: User.find(1)ActiveJob::Users
audited-activejob has a loose/optional dependency on activejob-users, and if you're using both gems the audit_user method will fallback to your existing job_user arguments you're already using, so you don't have to make any changes and everything will just work.
# associates all created audits with the provided user
MyJob.perform_later MyModel.find(1), job_user: current_userContributing
- Fork it
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Create new Pull Request