Search code examples
ruby-on-rails-3file-typecarrierwave

rails 3.0 and carrierwave how to prevent version creation for non-image type


I'm struggling a bit trying to achieve something that appeared simple initially to me. In the context of a rails 3.0 app using carrierwave. The user must be able do download any type of document except .exe files. in Carriewave there is the whitelist

def extension_white_list
    %w(jpg jpeg gif png)
end

I whish there was a blacklist as well it would easier in my case. Anyway this is the not the main concern.

for image file I set 2 version in my uploader class.

 version :thumb do
      process :resize_to_fit => [50, 50]  
  end


  version :small do
     process :resize_to_fit => [125, 125]
  end

I have to admit that I'm little bit confused by this syntax. What kind of ruby code "version" define. I mean, it is not a method, so what's that in a class?

I tried to create a method image?

def image?
%w(jpg jpeg gif png).include?(filename.extension.to_s)
end

and then called it from the version piece of code to prevent creation of those version when the file is not an image

version :thumb do
  if image?
    process :resize_to_fit => [50, 50]  
  end
end

but this code throw an error

undefined method `image?' for #<Class:0x000001017274f8> 

any help would be appreciated.

thanks.


Solution

  • Here's how you actually can do this. The current version of carrierwave supports conditional version processing now. See the wiki page https://github.com/jnicklas/carrierwave/wiki/How-to%3A-Do-conditional-processing

    To only create versions for specific types, do this:

    version :thumb, :if => :image? do
      process :resize_to_fit => [50, 50]  
    end
    
    protected
    
    def image?(new_file)
      new_file.content_type.include? 'image'
    end