module ActiveModel::Attributes::Normalization
Открытые методы экземпляра
# File activemodel/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 Нормализует указанный атрибут с использованием объявленных для него правил нормализации.
Примеры
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 # => " CRUISE-CONTROL@EXAMPLE.COM\n"
legacy_user.normalize_attribute(:email)
legacy_user.email # => "cruise-control@example.com" Поведение с Active Record
Во избежание путаницы нормализация не применяется при получении атрибута из базы данных. Это означает, что если запись была сохранена до объявления нормализации, атрибут записи не будет нормализован, пока ему не будет присвоено новое значение или пока нормализация не будет выполнена явно с помощью Normalization#normalize_attribute.
Обратите внимание: если ваше приложение было создано до Rails 7.1 и выполняет маршалинг экземпляров целевой модели (например, при кэшировании), необходимо установить ActiveRecord.marshalling_format_version в значение 7.1 или выше, используя config.load_defaults 7.1 или config.active_record.marshalling_format_version = 7.1. В противном случае Marshal может попытаться сериализовать нормализацию Proc и вызвать 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: " CRUISE-CONTROL@EXAMPLE.COM\n")
user.email # => "cruise-control@example.com"
user = User.find_by(email: "\tCRUISE-CONTROL@EXAMPLE.COM ")
user.email # => "cruise-control@example.com"
user.email_before_type_cast # => "cruise-control@example.com"
User.where(email: "\tCRUISE-CONTROL@EXAMPLE.COM ").count # => 1
User.where(["email = ?", "\tCRUISE-CONTROL@EXAMPLE.COM "]).count # => 0
User.exists?(email: "\tCRUISE-CONTROL@EXAMPLE.COM ") # => true
User.exists?(["email = ?", "\tCRUISE-CONTROL@EXAMPLE.COM "]) # => false
User.normalize_value_for(:phone, "+1 (555) 867-5309") # => "5558675309"
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.