File versioning in Ruby on Rails with Paperclip & acts_as_versioned

This short tutorial shows you how to manage file versioning in Ruby on Rails by making Paperclip falling in love with acts_as_versioned. Paperclip & acts_as_versioned are plug-ins for Ruby on Rails: Paperclip manages file upload, acts_as_versioned enables models versioning.

Patch Paperclip

I patched Paperclip to keep old files when a new revision is saved. A fork of Paperclip adding the option keep_old_files to make Paperclip working with acts_as_versioned is available here: http://github.com/pcreux/paperclip/tree/master. You can install it running:

script/plugin install pcreux_paperclip

Update your Paperclip + acts_as_versioned model

Just three things to do:

  1. update the url & path to store your files by ‘version’
  2. set the option keep_old_files to true when a new version get saved
  3. add the interpolation of :version
class Document < ActiveRecord::Base
  has_attached_file :attachment,
                    :url => "/system/attachments/:id/:version/:style/:basename.:extension",
                    :path => ":rails_root/public/system/attachments/:id/:version/:style/:basename.:extension",
                    :keep_old_files => :version_condition_met?

  acts_as_versioned

  Paperclip.interpolates :version do |attachement, style|
    attachement.instance.version.to_s
  end
end

I hope it helps. :)

. Bookmark the permalink. Post a comment or leave a trackback: Trackback URL.

9 Comments

  1. Posted July 29, 2009 at 14:52 | Permalink

    Thanks!
    Exactly what I was looking for.

  2. Johnny H
    Posted August 20, 2009 at 17:53 | Permalink

    Hey Philippe, thanks for sharing this – much appreciated. Keep up the good work!!!

  3. andy
    Posted October 29, 2009 at 01:23 | Permalink

    have you requested a pull back into Paperclip?

    This patch would be a useful addition.

  4. andy
    Posted October 29, 2009 at 01:51 | Permalink

    also, have you seen this Paperclip fork?

    http://github.com/alainravet/paperclip/commit/0943fa3a82447329ebaff4ae217a77fe8236dadb

    he does the same feature, differently – not sure which approach is better

    oddly, you both added the same comment to ‘lib/paperclip.rb’ – how did that happen?

    • Posted October 30, 2009 at 19:14 | Permalink

      Hey Andy, I requested a pull back into Paperclip a while ago. I gonna request again. I also saw this Paperclip fork while working on mine – I guess this comment just stayed in my mind. :)

  5. andy
    Posted November 5, 2009 at 07:25 | Permalink

    Hi Phillipe,

    I pull your changes into my fork of paperclip and pushed it to gemcutter as “paperclip_with_versions”

    “http://gemcutter.org/gems/paperclip_with_versions”

    Don’t mean to step on your toes here, but we needed this gem’d for our project mgmt.

    I used your example and got this working with acts-as-audited.

    Thanks

    • Posted November 12, 2009 at 06:29 | Permalink

      Hey Andy,

      that’s great. Happy to know it helped you.

      Cheers

  6. Imtiaz Ahmed
    Posted January 11, 2010 at 11:35 | Permalink

    How do you use this

    set the option keep_old_files to true when a new version get saved
    Where do we update the keeps_old_file

    • Posted January 12, 2010 at 06:54 | Permalink

      Check the line 5 of the code sample above.

      :keep_old_files => :version_condition_met?

Post a Comment

Your email is never published nor shared. Required fields are marked *

*
*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

  • Hi, my name is Philippe Creux.

    I am a software engineer specializing in Agile methods, Behavior Driven Development and Ruby on Rails. I live in Vancouver, Canada where I work for Versapay as a Ruby on Rails programmer & BDD guy. This blog is about Agile project management, Ruby programming and other cool things.