mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #17351 from akshat-sharma/master
Add case_sensitive option for confirmation validation
This commit is contained in:
commit
57393957e1
3 changed files with 30 additions and 4 deletions
|
@ -1,3 +1,7 @@
|
|||
* Add case_sensitive option for confirmation validator in models.
|
||||
|
||||
*Akshat Sharma*
|
||||
|
||||
* Ensure `method_missing` is called for methods passed to
|
||||
`ActiveModel::Serialization#serializable_hash` that don't exist.
|
||||
|
||||
|
|
|
@ -3,14 +3,16 @@ module ActiveModel
|
|||
module Validations
|
||||
class ConfirmationValidator < EachValidator # :nodoc:
|
||||
def initialize(options)
|
||||
super
|
||||
super({ case_sensitive: true }.merge!(options))
|
||||
setup!(options[:class])
|
||||
end
|
||||
|
||||
def validate_each(record, attribute, value)
|
||||
if (confirmed = record.send("#{attribute}_confirmation")) && (value != confirmed)
|
||||
human_attribute_name = record.class.human_attribute_name(attribute)
|
||||
record.errors.add(:"#{attribute}_confirmation", :confirmation, options.merge(attribute: human_attribute_name))
|
||||
if (confirmed = record.send("#{attribute}_confirmation"))
|
||||
unless confimation_value_equal?(record, attribute, value, confirmed)
|
||||
human_attribute_name = record.class.human_attribute_name(attribute)
|
||||
record.errors.add(:"#{attribute}_confirmation", :confirmation, options.merge(attribute: human_attribute_name))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -24,6 +26,14 @@ module ActiveModel
|
|||
:"#{attribute}_confirmation" unless klass.method_defined?(:"#{attribute}_confirmation=")
|
||||
end.compact)
|
||||
end
|
||||
|
||||
def confimation_value_equal?(record, attribute, value, confirmed)
|
||||
if !options[:case_sensitive] && value.is_a? String
|
||||
value.casecmp(confirmed) == 0
|
||||
else
|
||||
value == confirmed
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
module HelperMethods
|
||||
|
@ -55,6 +65,8 @@ module ActiveModel
|
|||
# Configuration options:
|
||||
# * <tt>:message</tt> - A custom error message (default is: "doesn't match
|
||||
# <tt>%{translated_attribute_name}</tt>").
|
||||
# * <tt>:case_sensitive</tt> - Looks for an exact match. Ignored by
|
||||
# non-text columns (+true+ by default).
|
||||
#
|
||||
# There is also a list of default options supported by every validator:
|
||||
# +:if+, +:unless+, +:on+, +:allow_nil+, +:allow_blank+, and +:strict+.
|
||||
|
|
|
@ -348,6 +348,16 @@ class Person < ActiveRecord::Base
|
|||
end
|
||||
```
|
||||
|
||||
There is also a `:case_sensitive` option that you can use to define whether the
|
||||
confirmation constraint will be case sensitive or not. This option defaults to
|
||||
true.
|
||||
|
||||
```ruby
|
||||
class Person < ActiveRecord::Base
|
||||
validates :email, confirmation: { case_sensitive: false }
|
||||
end
|
||||
```
|
||||
|
||||
The default error message for this helper is _"doesn't match confirmation"_.
|
||||
|
||||
### `exclusion`
|
||||
|
|
Loading…
Reference in a new issue