aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Draper <matthew@trebex.net>2014-07-18 07:07:03 +0930
committerMatthew Draper <matthew@trebex.net>2014-07-18 07:10:49 +0930
commite213b37fc17a363ad94b06ac6c725d9fa8799013 (patch)
tree2f6a04bd34a8a170949593483e3df52c3e59fc2c
parentabd74308957b383777c6a391017d39097309fe07 (diff)
parent0950d409b041415f13d037aa4293ac31f97ed236 (diff)
downloadrails-e213b37fc17a363ad94b06ac6c725d9fa8799013.tar.gz
rails-e213b37fc17a363ad94b06ac6c725d9fa8799013.tar.bz2
rails-e213b37fc17a363ad94b06ac6c725d9fa8799013.zip
Merge pull request #16210 from sonnym/assert_valid_keys_in_validate
Check for valid options in validate method
-rw-r--r--activemodel/CHANGELOG.md6
-rw-r--r--activemodel/lib/active_model/validations.rb6
-rw-r--r--activemodel/test/cases/validations_test.rb7
3 files changed, 19 insertions, 0 deletions
diff --git a/activemodel/CHANGELOG.md b/activemodel/CHANGELOG.md
index 555cd259d2..8d22e3ac46 100644
--- a/activemodel/CHANGELOG.md
+++ b/activemodel/CHANGELOG.md
@@ -1,3 +1,9 @@
+* Validate options passed to `ActiveModel::Validations.validate`.
+
+ Preventing, in many cases, the simple mistake of using `validate` instead of `validates`.
+
+ *Sonny Michaud*
+
* Deprecate `reset_#{attribute}` in favor of `restore_#{attribute}`.
These methods may cause confusion with the `reset_changes` that behaves differently
diff --git a/activemodel/lib/active_model/validations.rb b/activemodel/lib/active_model/validations.rb
index cf97f45dba..b3d345c8ca 100644
--- a/activemodel/lib/active_model/validations.rb
+++ b/activemodel/lib/active_model/validations.rb
@@ -141,6 +141,11 @@ module ActiveModel
# value.
def validate(*args, &block)
options = args.extract_options!
+
+ if args.all? { |arg| arg.is_a?(Symbol) }
+ options.assert_valid_keys(%i(on if unless))
+ end
+
if options.key?(:on)
options = options.dup
options[:if] = Array(options[:if])
@@ -148,6 +153,7 @@ module ActiveModel
Array(options[:on]).include?(o.validation_context)
}
end
+
args << options
set_callback(:validate, *args, &block)
end
diff --git a/activemodel/test/cases/validations_test.rb b/activemodel/test/cases/validations_test.rb
index 4fee704ef5..38e54b7f17 100644
--- a/activemodel/test/cases/validations_test.rb
+++ b/activemodel/test/cases/validations_test.rb
@@ -167,6 +167,13 @@ class ValidationsTest < ActiveModel::TestCase
end
end
+ def test_invalid_options_to_validate
+ assert_raises(ArgumentError) do
+ # A common mistake -- we meant to call 'validates'
+ Topic.validate :title, presence: true
+ end
+ end
+
def test_errors_conversions
Topic.validates_presence_of %w(title content)
t = Topic.new