Spec-Zone.ru › Ruby on Rails 8.1

module ActiveModel::Attributes::Normalization::ClassMethods

Публичные методы экземпляра

normalize_value_for (name, value) Показать исходный код
# File activemodel/lib/active_model/attributes/normalization.rb, line 134
def normalize_value_for(name, value)
  type_for_attribute(name).cast(value)
end

Нормализует заданное value с помощью нормализаций, объявленных для name.

Примеры

class User
  include ActiveModel::Attributes
  include ActiveModel::Attributes::Normalization

  attribute :email, :string

  normalizes :email, with: -> email { email.strip.downcase }
end

User.normalize_value_for(:email, " CRUISE-CONTROL@EXAMPLE.COM\n")
# => "cruise-control@example.com"
normalizes (*names, with:, apply_to_nil: false) Показать исходный код
# File activemodel/lib/active_model/attributes/normalization.rb, line 111
def normalizes(*names, with:, apply_to_nil: false)
  decorate_attributes(names) do |name, cast_type|
    NormalizedValueType.new(cast_type: cast_type, normalizer: with, normalize_nil: apply_to_nil)
  end

  self.normalized_attributes += names.map(&:to_sym)
end

Объявляет нормализацию для одного или нескольких атрибутов. Нормализация применяется при присваивании значения атрибуту или его проверке.

Поскольку нормализация может применяться несколько раз, она должна быть идемпотентной. Иными словами, повторное применение нормализации должно давать тот же результат, что и её однократное применение.

По умолчанию нормализация не применяется к значениям nil. Это поведение можно изменить с помощью параметра :apply_to_nil.

Параметры

  • :with — любой вызываемый объект, который принимает значение атрибута в качестве единственного аргумента и возвращает его нормализованное значение.

  • :apply_to_nil — следует ли применять нормализацию к значениям nil. По умолчанию — false.

Примеры

class User
  include ActiveModel::Attributes
  include ActiveModel::Attributes::Normalization

  attribute :email, :string
  attribute :phone, :string

  normalizes :email, with: -> email { email.strip.downcase }
  normalizes :phone, with: -> phone { phone.delete("^0-9").delete_prefix("1") }
end

user = User.new
user.email =    " CRUISE-CONTROL@EXAMPLE.COM\n"
user.email # => "cruise-control@example.com"

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