yodafan86
yodafan86

Reputation: 575

Paperclip gem and custom filenames in database Rails 2.3

I'm trying to create a custom filename for files uploaded via the paperclip gem using Paperclip.interpoles in the initializer. The problem I'm having is this is updating the custom filename on the file system when the file is uploaded, but the database filename remains the name of the source file. Is there a better way then having to reassign the database attribute to handle this?

Upvotes: 0

Views: 648

Answers (1)

toashd
toashd

Reputation: 1002

Try using before_create callback in ActiveRecord. As paperclip will not write the attached resource to disk until ActiveRecord::Base#save is called, this seems to be the right time to create your custom filename.

To do so, just register an ordinary method to create the custom filename. This will change the name of the attached image, which you'll then find on your file system and in your database.

Let's say you have a model, where you want to attach an image with a custom random filename.

In your model:

has_attached_file :image
before_create :randomize_image_file_name

Also in your model:

def randomize_image_file_name
  extension = File.extname(image_file_name).downcase
  self.image.instance_write(:file_name, "#{ActiveSupport::SecureRandom.hex(8)}#{extension}")
end

You can declare your method anywhere you want, though it's considered good practice to declare callback methods as protected or private.

This will save the attachment with a custom randomized filename.

Hope this helps.

Upvotes: 3

Related Questions