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:
- update the url & path to store your files by ‘version’
- set the option
keep_old_filestotruewhen a new version get saved - 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. :)
Entries (RSS)
Follow me on Twitter
LinkedIn profile
Photos
Videos
9 Comments
Thanks!
Exactly what I was looking for.
Hey Philippe, thanks for sharing this – much appreciated. Keep up the good work!!!
have you requested a pull back into Paperclip?
This patch would be a useful addition.
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?
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. :)
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
Hey Andy,
that’s great. Happy to know it helped you.
Cheers
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
Check the line 5 of the code sample above.
:keep_old_files => :version_condition_met?