Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Scope ActiveModel validations
Ruby
tag: v0.4.0

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
lib
spec
.gitignore
.rspec
Gemfile
Gemfile.lock
LICENSE
README.md
Rakefile
specs.watchr
validation-scopes.gemspec

README.md

Validation Scopes

Validation Scopes allows you to remove duplication in validations by grouping validations that share the same conditions. It works the same way as ActiveSupport's OptionMerger does, except instead of replacing duplicate keys it groups them into an array. This is so that nested if conditions work inside ActiveModel validations. Example, with result shown in comments:

class Car < ActiveRecord::Base
  validation_scope :if => Proc.new { |u| u.step == 2 } do |v|
    v.validates_presence_of :variant # , :if => Proc.new { |u| u.step == 2 }
    v.validation_scope :if => :something? do |s|
      s.validates_presence_of :body # , :if => [Proc.new { |u| u.step == 2 }, :something?]
    end
  end

  validation_scope :if => Proc.new { |u| u.step == 3 } do |v|
    v.validates_inclusion_of :outstanding_finance, :in => [true, false], :if => Proc.new { |u| u.finance == true }
    # Duplicate keys are turned into arrays
    # :if => [Proc.new { |u| u.finance == true }, Proc.new { |u| i.step == 3 }]

    v.validate do # v.validate :if => Proc.new { |u| u.step == 3 }
      errors.add(:weight, "Must be greater than 0") unless !@weight.nil? && @weight > 0
    end
  end
end

The options passed into the validation_scope method will usually be either :if or :unless, but any are accepted and they are passed onto the individual validators.

Installation

Add the gem to your Gemfile

gem "validation-scopes"

It will be included into ActiveRecord::Base if it is defined, if not use include ValidationScopes on any ActiveModel object.

Something went wrong with that request. Please try again.