From 2e4f7986b8ec90d7b41c385388be21b8cee79b9c Mon Sep 17 00:00:00 2001
From: Bogdan Gusiev <agresso@gmail.com>
Date: Mon, 6 Aug 2012 13:45:27 +0300
Subject: AM::Validation#validates: ability to pass custom exception to
 `:strict` option

---
 activemodel/lib/active_model/errors.rb                | 8 ++++++--
 activemodel/lib/active_model/validations/validates.rb | 7 +++++--
 2 files changed, 11 insertions(+), 4 deletions(-)

(limited to 'activemodel/lib')

diff --git a/activemodel/lib/active_model/errors.rb b/activemodel/lib/active_model/errors.rb
index 1026b0f4d3..b3b9ba8e56 100644
--- a/activemodel/lib/active_model/errors.rb
+++ b/activemodel/lib/active_model/errors.rb
@@ -283,15 +283,19 @@ module ActiveModel
     #
     # If the <tt>:strict</tt> option is set to true will raise
     # ActiveModel::StrictValidationFailed instead of adding the error.
+    # <tt>:strict</tt> option can also be set to any other exception.
     #
     #   person.errors.add(:name, nil, strict: true)
     #   # => ActiveModel::StrictValidationFailed: name is invalid
+    #   person.errors.add(:name, nil, strict: NameIsInvalid)
+    #   # => NameIsInvalid: name is invalid
     #
     #   person.errors.messages # => {}
     def add(attribute, message = nil, options = {})
       message = normalize_message(attribute, message, options)
-      if options[:strict]
-        raise ActiveModel::StrictValidationFailed, full_message(attribute, message)
+      if exception = options[:strict]
+        exception = ActiveModel::StrictValidationFailed if exception == true
+        raise exception, full_message(attribute, message)
       end
 
       self[attribute] << message
diff --git a/activemodel/lib/active_model/validations/validates.rb b/activemodel/lib/active_model/validations/validates.rb
index 5892ad29d1..eb6e604851 100644
--- a/activemodel/lib/active_model/validations/validates.rb
+++ b/activemodel/lib/active_model/validations/validates.rb
@@ -84,12 +84,15 @@ module ActiveModel
       #   or <tt>unless: Proc.new { |user| user.signup_step <= 2 }</tt>). The
       #   method, proc or string should return or evaluate to a +true+ or
       #   +false+ value.
-      # * <tt>:strict</tt> - Specifies whether validation should be strict.
-      #   See <tt>ActiveModel::Validation#validates!</tt> for more information.
+      # * <tt>:strict</tt> - if the <tt>:strict</tt> option is set to true
+      #   will raise ActiveModel::StrictValidationFailed instead of adding the error.
+      #   <tt>:strict</tt> option can also be set to any other exception.
       #
       # Example:
       #
       #   validates :password, presence: true, confirmation: true, if: :password_required?
+      #   validates :token, uniqueness: true, strict: TokenGenerationException
+      #
       #
       # Finally, the options +:if+, +:unless+, +:on+, +:allow_blank+, +:allow_nil+
       # and +:strict+ can be given to one specific validator, as a hash:
-- 
cgit v1.2.3