Skip to content

How To: Silently ignore missing files on destroy or overwrite

scottwb edited this page Jul 11, 2011 · 1 revision

Saving a new file upload to a model it is mounted on attempts to clean up the previously-uploaded file. Destroying a model object also attempts to remove its mounted file. This is great and normally works. However, if for some reason the file it wants to delete does not exist, it raises a NotFound exception. The actual exception varies depending on what storage you are using -- e.g.: Fog::Storage::Rackspace::NotFound if you're using Rackspace Cloud Files storage.

While it may be useful in catching other problems in your system, in production, you probably do not want to get stuck preventing model objects from being updated or deleted just because the file you want to delete was already deleted.

If you'd like to silently ignore these NotFound exceptions, you can do this simply by overriding the remove_avatar! and remove_previously_stored_avatar methods in your model class (replacing avatar with the name of your mount column). The example below demonstrates doing this just to wrap the default implementation with a rescue block specifically for the Rackspace storage provider's exceptions. You could easily modify this to handle other type of exceptions.

class User < ActiveRecord::Base
  mount_uploader :avatar, AvatarUploader
  
  # Override to silently ignore trying to remove missing
  # previous avatar when destroying a User.
  def remove_avatar!
    begin
      super
    rescue Fog::Storage::Rackspace::NotFound
    end
  end

  # Override to silently ignore trying to remove missing
  # previous avatar when saving a new one.
  def remove_previously_stored_avatar
    begin
      super
    rescue Fog::Storage::Rackspace::NotFound
      @previous_model_for_avatar = nil
    end
  end
end

For the original discussion on this, see this Google Groups thread

Clone this wiki locally