Module: ActiveModel::Attributes::Normalization
- Extended by:
- ActiveSupport::Concern
- Defined in:
- lib/active_model/attributes/normalization.rb
Defined Under Namespace
Modules: ClassMethods Classes: NormalizedValueType
Instance Method Summary collapse
-
#normalize_attribute(name) ⇒ Object
Normalizes a specified attribute using its declared normalizations.
Instance Method Details
#normalize_attribute(name) ⇒ Object
Normalizes a specified attribute using its declared normalizations.
Examples
class User
include ActiveModel::Attributes
include ActiveModel::Attributes::Normalization
attribute :email, :string
normalizes :email, with: -> email { email.strip.downcase }
end
legacy_user = User.load_from_legacy_data(...)
legacy_user.email # => " [email protected]\n"
legacy_user.normalize_attribute(:email)
legacy_user.email # => "[email protected]"
Behavior with Active Record
To prevent confusion, normalization will not be applied when the attribute is fetched from the database. This means that if a record was persisted before the normalization was declared, the record’s attribute will not be normalized until either it is assigned a new value, or it is explicitly migrated via Normalization#normalize_attribute.
Be aware that if your app was created before Rails 7.1, and your app marshals instances of the targeted model (for example, when caching), then you should set ActiveRecord.marshalling_format_version to 7.1 or higher via either config.load_defaults 7.1 or config.active_record.marshalling_format_version = 7.1. Otherwise, Marshal may attempt to serialize the normalization Proc and raise TypeError.
class User < ActiveRecord::Base
normalizes :email, with: -> email { email.strip.downcase }
normalizes :phone, with: -> phone { phone.delete("^0-9").delete_prefix("1") }
end
user = User.create(email: " [email protected]\n")
user.email # => "[email protected]"
user = User.find_by(email: "\[email protected] ")
user.email # => "[email protected]"
user.email_before_type_cast # => "[email protected]"
User.where(email: "\[email protected] ").count # => 1
User.where(["email = ?", "\[email protected] "]).count # => 0
User.exists?(email: "\[email protected] ") # => true
User.exists?(["email = ?", "\[email protected] "]) # => false
User.normalize_value_for(:phone, "+1 (555) 867-5309") # => "5558675309"
70 71 72 73 |
# File 'lib/active_model/attributes/normalization.rb', line 70 def normalize_attribute(name) # Treat the value as a new, unnormalized value. send(:"#{name}=", send(name)) end |