Search code examples
ruby-on-railscallbacksaveruby-on-rails-2

How can I update attributes in after_save without causing a recursion in rails 2.3?


I've got a model which has a video attached with Paperclip. After it saves I use the saved video to generate a thumbnail. I need to do this after every save, even when a new video hasn't been uploaded, because the user can change the time where the thumbnail is captured.

I am currently using after_post_process to do this, but it will only generate the thumbnail when uploading a file (this is a callback which is part of Paperclip).

I would ideally use an after_save callback like this:

after_save :save_thumbnail
def save_thumbnail
  #generate thumbnail...
  self.update_attributes(
    :thumbnail_file_name => File.basename(thumb), 
    :thumbnail_content_type => 'image/jpeg'
  )
end

Unfortunately update_attributes calls save, which then calls the before_save callback causing an infinite loop. Is there a simple way to circumvent this behaviour?


Solution

  • You could wrap it in a conditional, something like:

    def save_thumbnail
      if File.basename(thumb) != thumbnail_file_name
        self.update_attributes(
          :thumbnail_file_name => File.basename(thumb), 
          :thumbnail_content_type => 'image/jpeg'
        )
      end
    end
    

    That way it would only run once.