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.
Just add the gem to your Gemfile
and run bundle install
:
gem 'audited-activejob'
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_user
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)
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_user
- 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