aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel
diff options
context:
space:
mode:
authorCarl Lerche <me@carllerche.com>2011-02-05 16:33:00 -0800
committerCarl Lerche <me@carllerche.com>2011-02-05 16:33:00 -0800
commite9e9ed6b60a42a7c3afe3c4a9f8cf6d1e5422e59 (patch)
treee9d45b2dd7c00979fcc5bd36ce430ac5406c3bb0 /activemodel
parented7614aa7de2eaeba16c9af11cf09b4fd7ed6819 (diff)
downloadrails-e9e9ed6b60a42a7c3afe3c4a9f8cf6d1e5422e59.tar.gz
rails-e9e9ed6b60a42a7c3afe3c4a9f8cf6d1e5422e59.tar.bz2
rails-e9e9ed6b60a42a7c3afe3c4a9f8cf6d1e5422e59.zip
Be able to pass a validator method to #validates
Diffstat (limited to 'activemodel')
-rw-r--r--activemodel/lib/active_model/validations/with.rb6
-rw-r--r--activemodel/test/cases/validations/with_validation_test.rb12
-rw-r--r--activemodel/test/models/topic.rb4
3 files changed, 22 insertions, 0 deletions
diff --git a/activemodel/lib/active_model/validations/with.rb b/activemodel/lib/active_model/validations/with.rb
index 200efd4eb5..16d81263a2 100644
--- a/activemodel/lib/active_model/validations/with.rb
+++ b/activemodel/lib/active_model/validations/with.rb
@@ -8,6 +8,12 @@ module ActiveModel
end
end
+ class WithValidator < EachValidator
+ def validate_each(record, attr, val)
+ record.send options[:with]
+ end
+ end
+
module ClassMethods
# Passes the record off to the class or classes specified and allows them
# to add errors based on more complex conditions.
diff --git a/activemodel/test/cases/validations/with_validation_test.rb b/activemodel/test/cases/validations/with_validation_test.rb
index 6d825cd316..33efedcd7c 100644
--- a/activemodel/test/cases/validations/with_validation_test.rb
+++ b/activemodel/test/cases/validations/with_validation_test.rb
@@ -171,4 +171,16 @@ class ValidatesWithTest < ActiveModel::TestCase
assert topic.errors[:title].empty?
assert topic.errors[:content].empty?
end
+
+ test "validates_with can validate with an instance method" do
+ Topic.validates :title, :with => :my_validation
+
+ topic = Topic.new :title => "foo"
+ assert topic.valid?
+ assert topic.errors[:title].empty?
+
+ topic = Topic.new
+ assert !topic.valid?
+ assert_equal ['is missing'], topic.errors[:title]
+ end
end
diff --git a/activemodel/test/models/topic.rb b/activemodel/test/models/topic.rb
index 2f0bb95071..8d49c1dd27 100644
--- a/activemodel/test/models/topic.rb
+++ b/activemodel/test/models/topic.rb
@@ -29,4 +29,8 @@ class Topic
self.after_validation_performed = true
end
+ def my_validation
+ errors.add :title, "is missing" unless title
+ end
+
end