Provides a history of attribute and association updates for models. This coincides with a versioning system (such as acts_as_versioned). When used in tandem, you get both a history of changes and a history of what changed.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
lib/activerecord
test
MIT-LICENSE
README.markdown
Rakefile
TODO
init.rb

README.markdown

Shadow

Provides a history of attribute and association updates for models. This coincides with a versioning system (such as acts_as_versioned). When used in tandem, you get both a history of changes and a history of what changed.

Installation

If you are running Rails 2.1 or later, installation is straightforward:

$ ./script/plugin install git://github.com/TheBreeze/shadow.git

Otherwise, the process is a bit more involved, see below:

$ cd /path/to/your/rails/app $ git clone --depth 1 git://github.com/TheBreeze/shadow.git "./vendor/plugins/shadow/"; rm -rf ./vendor/plugins/shadow/.git

Example

After creating your migrations (see TODO)

In your model

class Vacation < ActiveRecord::Base
  has_many :photos

  # By default, shadows all :attributes and :associations. Here we're attaching a user, so we know who added a photo.
  shadow :associations => :photos, :attach => :user
end

In your controller (here we assume nested under VacationController)

class PhotosController < ApplicationController
  def create
    @vacation = Vacation.find params[:vacation_id]

    # This is where you attach the :user to the photo. If Photo doesn't have a user attribute or association, shadow
    # will attach an attr_accessor to it and store it with the AssociationShadow record.
    @photo = Photo.new params[:photo].merge(:user => current_user)

    # You must either use the #association<<, #association.push, or #association.create for the shadow to be created.
    if @vacation.photos << @photo
      # success!
    end
  end
end

In your view (displaying the updates in the show action of VacationController)

<h1>Vacation Updates</h1>

<% @vacation.association_updates.each do |update| -%>
  <p><%= update.user.name %> <%= update.action %> <%= update.record.thumbnail %> to <%= update.association %></p>
<% end -%>

Example result from view:

<h1>Vacation Updates</h1>
<p>Jordan added [photo thumbnail] to photos</p>

Copyright (c) 2008 Jordan Fowler, released under the MIT license, and originally developed for Cinema Treasures, LLC (http://www.cinematreasures.org/).