artimys
9/24/2011 - 7:33 AM

CarrierWave - Validate Dimensions

CarrierWave - Validate Dimensions

class User < ActiveRecord::Base

  mount_uploader :avatar, AvatarUploader
  
  validates :username, :presence => true
  validate :check_avatar_dimensions
  
  def check_avatar_dimensions
    ::Rails.logger.info "Avatar upload dimensions: #{self.avatar_upload_width}x#{self.avatar_upload_height}"
    errors.add :avatar, "Dimensions of uploaded avatar should be not less than 150x150 pixels." if self.avatar_upload_width < 150 || avatar_upload_height < 150
  end

end
# encoding: utf-8

class AvatarUploader < CarrierWave::Uploader::Base

  include CarrierWave::MiniMagick

  # Choose what kind of storage to use for this uploader:
  storage :file

  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  # Provide a default URL as a default if there hasn't been a file uploaded:
  def default_url
    "/uploads/missing/#{model.class.to_s.underscore}/#{version_name}.png"
  end
  
  # for image size validation
  # fetching dimensions in uploader, validating it in model
  before :cache, :capture_size_before_cache # callback, example here: http://goo.gl/9VGHI
  def capture_size_before_cache(new_file) 
    if model.avatar_upload_width.nil? || model.avatar_upload_height.nil?
      model.avatar_upload_width, model.avatar_upload_height = `identify -format "%wx %h" #{new_file.path}`.split(/x/).map { |dim| dim.to_i }
    end
  end
  
  # resizing uploads
  
  process :resize_to_fill => [148, 148]

  # Add a white list of extensions which are allowed to be uploaded.
  # For images you might use something like this:
  def extension_white_list
    %w(jpg jpeg png)
  end

end