No commit activity in last 3 years
No release in over 3 years
Scope ActiveModel validations
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Runtime

 Project Readme

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.