module ActiveModel::Attributes::Normalization::ClassMethods
Публичные методы экземпляра
# 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"
# 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.