Module: DataMapper::Validations::ValidatesWithBlock

Included in:
ClassMethods
Defined in:
lib/dm-validations/validators/block_validator.rb

Overview

Author:

  • teamon

Since:

  • 0.9

Instance Method Summary collapse

Instance Method Details

#validates_with_block(*fields, &block) ⇒ Object

Validate using the given block. The block given needs to return:

result::<Boolean>, Error Message::<String>

Examples:

Usage

require 'dm-validations'

class Page
  include DataMapper::Resource

  property :zip_code, String

  validates_with_block do
    if @zip_code == "94301"
      true
    else
      [false, "You're in the wrong zip code"]
    end
  end

  # A call to valid? will return false and
  # populate the object's errors with "You're in the
  # wrong zip code" unless zip_code == "94301"

  # You can also specify field:

  validates_with_block :zip_code do
    if @zip_code == "94301"
      true
    else
      [false, "You're in the wrong zip code"]
    end
  end

  # it will add returned error message to :zip_code field

Since:

  • 0.9



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/dm-validations/validators/block_validator.rb', line 41

def validates_with_block(*fields, &block)
  @__validates_with_block_count ||= 0
  @__validates_with_block_count += 1

  # create method and pass it to MethodValidator
  unless block_given?
    raise ArgumentError, 'You need to pass a block to validates_with_block method'
  end

  method_name = "__validates_with_block_#{@__validates_with_block_count}".to_sym
  define_method(method_name, &block)

  options = fields.last.is_a?(Hash) ? fields.last.pop.dup : {}
  options[:method] = method_name
  fields = [method_name] if fields.empty?

  validators.add(MethodValidator, *fields + [options])
end