I have a before_save method that I call that renames an uploaded image.
before_save :randomize_file_name
def randomize_file_name
extension = File.extname(screen_file_name).downcase
key = ActiveSupport::SecureRandom.hex(8)
self.screen.instance_write(:file_name, "#{key}#{extension}")
end
That method is part of my Item
model.
That works great when I create a new item or need to update the image associated with an item...but the problem is that if I need to update an item but NOT the image, the randomize_file_name
method still gets run and renames the file in the database (though not the file itself, obviously).
So, I'm thinking I need to figure out a way to only run randomize_file_name
if a file is included in the form submission...but I'm not sure how to pull that off.
Use dirty objects.
before_save :randomize_file_name
def randomize_file_name
# assuming the field that holds the name
# is called screen_file_name
if screen_file_name_changed?
extension = File.extname(screen_file_name).downcase
key = ActiveSupport::SecureRandom.hex(8)
self.screen.instance_write(:file_name, "#{key}#{extension}")
end
end
before_save :randomize_file_name
def randomize_file_name
if screen_file_name
extension = File.extname(screen_file_name).downcase
key = ActiveSupport::SecureRandom.hex(8)
return self.screen.instance_write(:file_name, "#{key}#{extension}") unless !screen_changed?
end
end
This checks only if the file has changed. Works 90% of the time
go ahead and make your before_save method called on every save but as a first step inside the method you are now having called "before save" you should have an if condition that tests for the specific case you need.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With