diff options
author | Ryuta Kamizono <kamipo@gmail.com> | 2018-08-19 14:57:05 +0900 |
---|---|---|
committer | Ryuta Kamizono <kamipo@gmail.com> | 2018-08-24 00:44:02 +0900 |
commit | 47a6d788ddbab08b2a04c72cd80352aac44090ab (patch) | |
tree | a3dbe86af22b7357be32a33a670e408ef1dcad57 /activemodel/lib/active_model/validations | |
parent | a0b57bbb21ce81071220bd8c6cfd8cdda342c6c6 (diff) | |
download | rails-47a6d788ddbab08b2a04c72cd80352aac44090ab.tar.gz rails-47a6d788ddbab08b2a04c72cd80352aac44090ab.tar.bz2 rails-47a6d788ddbab08b2a04c72cd80352aac44090ab.zip |
Fix numericality validator to still use value before type cast except Active Record
The purpose of fe9547b is to work type casting to value from database.
But that was caused not to use the value before type cast even except
Active Record.
There we never guarantees that the value before type cast was going to
the used in this validation, but we should not change the behavior
unless there is some particular reason.
To restore original behavior, still use the value before type cast if
`came_from_user?` is undefined (i.e. except Active Record).
Fixes #33651.
Fixes #33686.
Diffstat (limited to 'activemodel/lib/active_model/validations')
-rw-r--r-- | activemodel/lib/active_model/validations/numericality.rb | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/activemodel/lib/active_model/validations/numericality.rb b/activemodel/lib/active_model/validations/numericality.rb index 3753040316..126a87ac6e 100644 --- a/activemodel/lib/active_model/validations/numericality.rb +++ b/activemodel/lib/active_model/validations/numericality.rb @@ -21,10 +21,17 @@ module ActiveModel def validate_each(record, attr_name, value) came_from_user = :"#{attr_name}_came_from_user?" - if record.respond_to?(came_from_user) && record.public_send(came_from_user) - raw_value = record.read_attribute_before_type_cast(attr_name) - elsif record.respond_to?(:read_attribute) - raw_value = record.read_attribute(attr_name) + if record.respond_to?(came_from_user) + if record.public_send(came_from_user) + raw_value = record.read_attribute_before_type_cast(attr_name) + elsif record.respond_to?(:read_attribute) + raw_value = record.read_attribute(attr_name) + end + else + before_type_cast = :"#{attr_name}_before_type_cast" + if record.respond_to?(before_type_cast) + raw_value = record.public_send(before_type_cast) + end end raw_value ||= value |