Spec-Zone.ru › Ruby on Rails 8.1

module ActiveModel::Attributes::Normalization

Подключенные модули:
ActiveModel::Dirty, ActiveModel::Validations::Callbacks

Открытые методы экземпляра

normalize_attribute (name) Показать исходный код
# 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API