Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Rails plugin to enable soft delete of records. Includes named scopes and callbacks for delete and undelete operations.
Ruby
branch: master

This branch is even with hlubek:master

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
lib
rails
test
.gitignore
MIT-LICENSE
README.textile
Rakefile

README.textile

acts_as_deleted

This plugin is based on the original acts_as_deleted plugin by kivanio.

What is it about?

A Rails plugin to enable soft deletion (with other words: hiding) of records.
Some fixes for callbacks (before_delete, after_delete, before_undelete, after_undelete)
were added. Additionally most of the parts have got tests now.

Installation:

script/plugin install git://github.com/chlu/acts_as_deleted.git
  • Create migrations for your models to add the acts_as_deleted columns
  • Add acts_as_deleted to your models

Examples:

In your migration (for a new record):

class CreateCars < ActiveRecord::Migration
  def self.up
    create_table :cars do |t|
      t.string :name

      # Use "deletestamps" to create columns "deleted" and "deleted_at"
      # With "true", a column "deleted_by" will be created to set an user id (e.g. with restful-authentication)
      t.deletestamps(true)
      
      t.timestamps
    end
  end

  def self.down
    drop_table :cars
  end
end

In your model:

class Car < ActiveRecord::Base
  # Use default named scopes: "only_deleted" and "without_deleted"
  acts_as_deleted

  # You can use callbacks for delete and undelete just like other active record callbacks
  after_delete :notify_someone

protected
  def notify_someone
    logger.info('Your car has been deleted. Ouch.')
  end
end

In your Controller:

class CarController < ApplicationController
  
  # Use scope "without_deleted" to find normal records
  def index
    @cars = Car.without_deleted
  end
  
  # In destroy action use "delete" method to hide a record
  def destroy
   @car = Car.find(params[:id])
    if @car.delete
      flash[:notice] = 'Bye Bye Car.'
    end
    redirect_to(cars_url)
  end
  
  # When you use plugin restful-authentication, you can use "delete_with_user" to save user
  def destroy_with_user
    @car = Car.find(params[:id])
    if @car.delete_with_user(current_user.id)
      flash[:notice] = 'Bye Bye Car.'
    end
    redirect_to(cars_url)
  end
  
  # A record can be undeleted
  def undelete
    @car = Car.find(params[:id])
    @car.undelete
  end
end

Tips:

To use validates_uniqueness_of with this plugin, you should use the option :scope of validates_uniqueness_of to prevent unique conflicts with deleted records.

validates_uniqueness_of :name, :scope => :deleted

The above example would validate “name AND deleted” instead of only “name”.

Copyright

Copyright © 2009 [Christopher Hlubek] http://www.resoap.com, released under the MIT license

Originally by:

Copyright © 2008 [Kivanio Barbosa] http://www.kivanio.com.br, released under the MIT license

Something went wrong with that request. Please try again.