module FileColumn::Validations::ClassMethods

This module contains methods to create validations of uploaded files. All methods in this module will be included as class methods into ActiveRecord::Base so that you can use them in your models like this:

class Entry < ActiveRecord::Base
  file_column :image
  validates_filesize_of :image, :in => 0..1.megabyte
end

Constants

EXT_REGEXP
IMAGE_SIZE_REGEXP

Public Instance Methods

validates_file_format_of(*attrs) click to toggle source

This validates the file type of one or more file_columns. A list of file columns should be given followed by an options hash.

Required options:

  • :in => list of extensions or mime types. If mime types are used they will be mapped into an extension via FileColumn::ClassMethods::MIME_EXTENSIONS.

Examples:

validates_file_format_of :field, :in => ["gif", "png", "jpg"]
validates_file_format_of :field, :in => ["image/jpeg"]
# File lib/validations.rb, line 30
def validates_file_format_of(*attrs)

  options = attrs.pop if attrs.last.is_a?Hash
  raise ArgumentError, "Please include the :in option." if !options || !options[:in]
  options[:in] = [options[:in]] if options[:in].is_a?String
  raise ArgumentError, "Invalid value for option :in" unless options[:in].is_a?Array

  validates_each(attrs, options) do |record, attr, value|
    unless value.blank?
      mime_extensions = record.send("#{attr}_options")[:mime_extensions]
      extensions = options[:in].map{|o| mime_extensions[o] || o }
      record.errors.add attr, "is not a valid format." unless extensions.include?(value.scan(EXT_REGEXP).flatten.first)
    end
  end

end
validates_filesize_of(*attrs) click to toggle source

This validates the file size of one or more file_columns. A list of file columns should be given followed by an options hash.

Required options:

  • :in => A size range. Note that you can use ActiveSupport’s numeric extensions for kilobytes, etc.

Examples:

validates_filesize_of :field, :in => 0..100.megabytes
validates_filesize_of :field, :in => 15.kilobytes..1.megabyte
# File lib/validations.rb, line 57
def validates_filesize_of(*attrs)  

  options = attrs.pop if attrs.last.is_a?Hash
  raise ArgumentError, "Please include the :in option." if !options || !options[:in]
  raise ArgumentError, "Invalid value for option :in" unless options[:in].is_a?Range

  validates_each(attrs, options) do |record, attr, value|
    unless value.blank?
      size = File.size(value)
      record.errors.add attr, "is smaller than the allowed size range." if size < options[:in].first
      record.errors.add attr, "is larger than the allowed size range." if size > options[:in].last
    end
  end

end
validates_image_size(*attrs) click to toggle source

Validates the image size of one or more file_columns. A list of file columns should be given followed by an options hash. The validation will pass if both image dimensions (rows and columns) are at least as big as given in the :min option.

Required options:

  • :min => minimum image dimension string, in the format NNxNN (columns x rows).

Example:

validates_image_size :field, :min => "1200x1800"

This validation requires RMagick to be installed on your system to check the image’s size.

# File lib/validations.rb, line 89
def validates_image_size(*attrs)      
  options = attrs.pop if attrs.last.is_a?Hash
  raise ArgumentError, "Please include a :min option." if !options || !options[:min]
  minimums = options[:min].scan(IMAGE_SIZE_REGEXP).first.collect{|n| n.to_i} rescue []
  raise ArgumentError, "Invalid value for option :min (should be 'XXxYY')" unless minimums.size == 2

  require 'RMagick'

  validates_each(attrs, options) do |record, attr, value|
    unless value.blank?
      begin
        img = ::Magick::Image::read(value).first
        record.errors.add('image', "is too small, must be at least #{minimums[0]}x#{minimums[1]}") if ( img.rows < minimums[1] || img.columns < minimums[0] )
      rescue ::Magick::ImageMagickError
        record.errors.add('image', "invalid image")
      end
      img = nil
      GC.start
    end
  end
end