#255 Undo with Paper Trail
Feb 28, 2011 | 13 minutes | Plugins
Undo and redo behavior is easy to add with a versioning gem such as Paper Trail. Learn how to add an undo link to any model's flash message.
- Download:
- source codeProject Files in Zip (124 KB)
- mp4Full Size H.264 Video (21.6 MB)
- m4vSmaller H.264 Video (14.4 MB)
- webmFull Size VP8 Video (37 MB)
- ogvFull Size Theora Video (31 MB)
Resources
bash
bundle
rails g paper_trail:install
rake db:migrate
rails g controller versions
bundle rails g paper_trail:install rake db:migrate rails g controller versions
Gemfile
gem 'paper_trail'
gem 'paper_trail'
models/product.rb
has_paper_trail
has_paper_trail
products_controller.rb
def undo_link
view_context.link_to("undo", revert_version_path(@product.versions.scoped.last), :method => :post)
end
def undo_link view_context.link_to("undo", revert_version_path(@product.versions.scoped.last), :method => :post) end
routes.rb
post "versions/:id/revert" => "versions#revert", :as => "revert_version"
post "versions/:id/revert" => "versions#revert", :as => "revert_version"
versions_controller.rb
def revert
@version = Version.find(params[:id])
if @version.reify
@version.reify.save!
else
@version.item.destroy
end
link_name = params[:redo] == "true" ? "undo" : "redo"
link = view_context.link_to(link_name, revert_version_path(@version.next, :redo => !params[:redo]), :method => :post)
redirect_to :back, :notice => "Undid #{@version.event}. #{link}"
end
def revert @version = Version.find(params[:id]) if @version.reify @version.reify.save! else @version.item.destroy end link_name = params[:redo] == "true" ? "undo" : "redo" link = view_context.link_to(link_name, revert_version_path(@version.next, :redo => !params[:redo]), :method => :post) redirect_to :back, :notice => "Undid #{@version.event}. #{link}" end

