From 84081fcc548b309a79580b03aab6a39b726e0b03 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Valim?= <jose.valim@gmail.com>
Date: Tue, 3 Aug 2010 15:34:31 +0200
Subject: Freeze options so we raise an error when people modify it in place.

---
 activemodel/lib/active_model/validations.rb | 6 ++++--
 activemodel/lib/active_model/validator.rb   | 2 +-
 2 files changed, 5 insertions(+), 3 deletions(-)

(limited to 'activemodel/lib')

diff --git a/activemodel/lib/active_model/validations.rb b/activemodel/lib/active_model/validations.rb
index 1a58d4c4fb..3407c59e7a 100644
--- a/activemodel/lib/active_model/validations.rb
+++ b/activemodel/lib/active_model/validations.rb
@@ -118,11 +118,13 @@ module ActiveModel
       #   end
       #
       def validate(*args, &block)
-        options = args.last
-        if options.is_a?(Hash) && options.key?(:on)
+        options = args.extract_options!
+        if options.key?(:on)
+          options = options.dup
           options[:if] = Array.wrap(options[:if])
           options[:if] << "validation_context == :#{options[:on]}"
         end
+        args << options
         set_callback(:validate, *args, &block)
       end
 
diff --git a/activemodel/lib/active_model/validator.rb b/activemodel/lib/active_model/validator.rb
index 52192d5988..163124d531 100644
--- a/activemodel/lib/active_model/validator.rb
+++ b/activemodel/lib/active_model/validator.rb
@@ -111,7 +111,7 @@ module ActiveModel #:nodoc:
 
     # Accepts options that will be made available through the +options+ reader.
     def initialize(options)
-      @options = options
+      @options = options.freeze
     end
 
     # Return the kind for this validator.
-- 
cgit v1.2.3