aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel/lib/active_model/validations
diff options
context:
space:
mode:
authorRyuta Kamizono <kamipo@gmail.com>2018-08-19 14:57:05 +0900
committerRyuta Kamizono <kamipo@gmail.com>2018-08-24 00:44:02 +0900
commit47a6d788ddbab08b2a04c72cd80352aac44090ab (patch)
treea3dbe86af22b7357be32a33a670e408ef1dcad57 /activemodel/lib/active_model/validations
parenta0b57bbb21ce81071220bd8c6cfd8cdda342c6c6 (diff)
downloadrails-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.rb15
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