Fix encrypted attributes improperly casted #1836
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR fixes a bug introduced by ActiveRecord::Encrypted attributes.
Instead of returning a
ActiveModel::Type::String
like they used to, encrypted attributes return an instance ofActiveRecord::Encryption::EncryptedAttributeType
, on which you need to call#cast_type
in order to obtain the original type.To fix this, I check whether or not the attribute
#responds_to?(:cast_type)
which would indicate that we need to take into account the underlying type instead of just#type_for_attribute
.Checking this instead of checking if the
attribute_name
#responds_to?(:encrypted_attributes)
allows to take into account other forms of type overriding that ActiveRecord may introduce in the future or potentially already exist.See the type difference below between a regular string attribute and an encrypted attribute
Fixes #1829