module UndoableHelper def self.included (base) base.extend(UndoableMethods) end module UndoableMethods def undoable_methods # extend ClassMethods include InstanceMethods end end module InstanceMethods def change(description, undo_redirect, redo_redirect, &block) undo_manager.change(description, undo_redirect, redo_redirect, &block) end def undo_description undo_manager.undo_description end def redo_description undo_manager.redo_description end def undo_redo_links links = [] links << "Undo #{link_to(undo_description, undo_path)}" if undo_description links << "Redo #{link_to(redo_description, redo_path)}" if redo_description links.join(" - ") end def undo redirect_to(undo_manager.undo) end def redo redirect_to(undo_manager.redo) end protected def undo_manager session['undo_manager'] ||= UndoManager.create UndoManager.current = session['undo_manager'] end end # module ClassMethods # end end