Project

rollbacker

0.0
No commit activity in last 3 years
No release in over 3 years
Rollbacker allows you to declaratively specify what CRUD operations should be audited. The changes of objects are added to a queue where the auditor can approve and reject those changes.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

Runtime

 Project Readme

Rollbacker

Rollbacker is a manage tool for auditing changes to your ActiveRecord. The changes of objects are added to a queue where the auditor can approve and reject those changes.

Installation

To use it with your Rails 3 project, add the following line to your Gemfile

gem 'rollbacker'

Generate the migration and create the rollbacker_changes table

$ rails generate rollbacker:migration
$ rake db:migrate

Usage

Simply call rollbacker on your models:

class Model < ActiveRecord::Base
  rollbacker(:create, :update, :destroy)
end

After that, whenever a model is created, updated or destroyed, a new RollbackerChange record is created.

# Create Model
> Model.count
=> 0
> Model.create(name: 'Name', value: 'Value')
=> #<Model id: nil, name: "Name", value: "Value">
> Model.count
=> 0
> RollbackerChange.last.approve
> Model.count
=> 1

# Update Model
> m = Model.first
=> #<Model id: 1, name: "Name", value: "Value">
> m.update_attribute(:name, 'New')
> m.reload
=> #<Model id: 1, name: "Name", value: "Value">
> m.rollbacker_changes.last.rollbacked_changes
=> {"name"=>["Name", "New"]}
> m.update_attributes(:name=>'Newer', :value => 'New')
> m.rollbacker_changes.last.rollbacked_changes
=> {"name"=>["Name", "Newer"], "value"=>["Value", "New"]}
> m.rollbacker_changes.last.approve('value')
> m.reload
=> #<Model id: 1, name: "Name", value: "New">
> m.rollbacker_changes.last.rollbacked_changes
=> {"name"=>["Name", "Newer"]}
> m.rollbacker_changes.last.reject
> m.reload
=> #<Model id: 1, name: "Name", value: "New">

# Destroy Model
> m.destroy
> Model.count
=> 1
> m.rollbacker_changes.last.approve
> Model.count
=> 0

The rollbacked_changes column automatically serializes the changes of any model attributes modified during the action. If there are only a few attributes you want to track or a couple that you want to prevent from being tracked, you can specify that in the rollbacker call. For example

rollbacker(:create, :destroy, :except => [:title])
rollbacker(:update, :only => :title)

Current User Tracking

If you're using Rollbacker in a Rails application, all changes made within a request will automatically be attributed to the current user. By default, Rollbacker uses the current_user method in your controller.

class PostsController < ApplicationController
  def create
    current_user # => #<User name: "Steve">
    @post = Post.create(params[:post])
    @post.rollbacker_changes.last.user # => #<User name: "Steve">
  end
end

Integration

There may be some instances where you need to perform an action on your model object without Rollbacker. In those cases you can include the Rollbacker::Status module for help.

class PostsController < ApplicationController
  include Rollbacker::Status

  def update
    post = Post.find(params[:id])
    without_rollbacker { post.update_attributes(params[:post]) } # Rollbacker is disabled for the entire block
  end
end

You can also force Rollbacker to track any actions within a block as a specified user.

class PostsController < ApplicationController
  include Rollbacker::Status

  def update
    post = Post.find(params[:id])
    rollbacker_as(another_user) { post.update_attributes(params[:post]) }
  end
end

For more details, I suggest you check out the test examples in the spec folder itself.