Permalink
Browse files

Merge pull request #7826 from sikachu/master-validators-kind

Make `.validators_on` accept `:kind` option
  • Loading branch information...
2 parents 6b802cd + 4f9b59d commit 4e9f53f9736544f070e75e516c71137b7eb49a7a @rafaelfranca rafaelfranca committed Oct 3, 2012
View
@@ -1,5 +1,15 @@
## Rails 4.0.0 (unreleased) ##
+* `ActiveModel::Validators#validators_on` now accepts a `:kind` option which will filter out the
+ validators on a particular attribute based on its kind.
+
+ Person.validators_on(:name)
+ # => [#<ActiveModel::Validations::PresenceValidator:0x007fe604914e60 @attributes=[:name], @options={}>,
+ # #<ActiveModel::Validations::InclusionValidator:0x007fe603bb8780 @attributes=[:age], @options={:in=>0..99}>]
+
+ Person.validators_on(:name, kind: :presence)
+ # => [#<ActiveModel::Validations::PresenceValidator:0x007fe604914e60 @attributes=[:name], @options={}>]
+
* Add `ActiveModel::ForbiddenAttributesProtection`, a simple module to
protect attributes from mass assignment when non-permitted attributes are passed.
@@ -187,10 +187,21 @@ def validators
# # #<ActiveModel::Validations::PresenceValidator:0x007fe604914e60 @attributes=[:name], @options={}>,
# # #<ActiveModel::Validations::InclusionValidator:0x007fe603bb8780 @attributes=[:age], @options={:in=>0..99}>
# # ]
+ #
+ # You can also pass a +:kind+ option to filter the validators based on their kind.
+ #
+ # Person.validators_on(:name, kind: :presence)
+ # # => [#<ActiveModel::Validations::PresenceValidator:0x007fe604914e60 @attributes=[:name], @options={}>]
def validators_on(*attributes)
+ options = attributes.extract_options!
+
attributes.map do |attribute|
_validators[attribute.to_sym]
- end.flatten
+ end.flatten.tap do |validators|
+ if options[:kind]
+ validators.select! { |validator| validator.kind == options[:kind] }
+ end
+ end
end
# Returns +true+ if +attribute+ is an attribute method, +false+ otherwise.
@@ -287,6 +287,14 @@ def test_list_of_validators_will_be_empty_when_empty
assert_equal [], Topic.validators_on(:author_name)
end
+ def test_list_of_validators_on_an_attribute_based_on_kind
+ Topic.validates_presence_of :title, :content
+ Topic.validates_length_of :title, :minimum => 2
+
+ assert_equal Topic.validators_on(:title).select { |v| v.kind == :presence },
+ Topic.validators_on(:title, kind: :presence)
+ end
+
def test_validations_on_the_instance_level
auto = Automobile.new

0 comments on commit 4e9f53f

Please sign in to comment.