модуль ActiveModel::Validations::HelperMethods
Методы публичного экземпляра
# File activemodel/lib/active_model/validations/absence.rb, line 28 def validates_absence_of(*attr_names) validates_with AbsenceValidator, _merge_attributes(attr_names) end
Проверяет, что указанные атрибуты пусты (как определено в Object#present?).
class Person < ActiveRecord::Base validates_absence_of :first_name end
Атрибут first_name должен быть в объекте и должен быть пустым.
Параметры конфигурации:
-
:message- пользовательское сообщение об ошибке (по умолчанию: «должен быть пустым»).
Также существует список параметров по умолчанию, поддерживаемых каждым валидатором: :if, :unless, :on, :allow_nil, :allow_blank, и :strict. Дополнительная информация в ActiveModel::Validations::ClassMethods#validates.
# File activemodel/lib/active_model/validations/acceptance.rb, line 108 def validates_acceptance_of(*attr_names) validates_with AcceptanceValidator, _merge_attributes(attr_names) end
Оборачивает проверку принятия условий соглашения (например, чекбокса «Условия использования»).
class Person < ActiveRecord::Base validates_acceptance_of :terms_of_service validates_acceptance_of :eula, message: 'must be abided' end
Если столбец базы данных не существует, атрибут terms_of_service полностью виртуальный. Эта проверка выполняется только если terms_of_service не nil.
Параметры конфигурации:
-
:message- пользовательское сообщение об ошибке (по умолчанию: «должен быть принят»). -
:accept- указывает значение, которое считается принятым. Также принимает массив возможных значений. Значение по умолчанию — массив [“1”, true], что удобно для HTML-чекбоксов. Это значение должно быть установлено или включаться вtrue, если вы валидируете столбец базы данных, поскольку атрибут приводится к типуtrueперед валидацией.
Также существует список параметров по умолчанию, поддерживаемых каждым валидатором: :if, :unless, :on, :allow_nil, :allow_blank, и :strict. Дополнительная информация в ActiveModel::Validations::ClassMethods#validates.
# File activemodel/lib/active_model/validations/comparison.rb, line 85 def validates_comparison_of(*attr_names) validates_with ComparisonValidator, _merge_attributes(attr_names) end
Проверяет, что значение указанного атрибута соответствует всем определенным сравнениям с другим значением, проком или атрибутом.
class Person < ActiveRecord::Base validates_comparison_of :value, greater_than: 'the sum of its parts' end
Параметры конфигурации:
-
:message- пользовательское сообщение об ошибке (по умолчанию: «сравнение не выполнено»). -
:greater_than- указывает, что значение должно быть больше указанного значения. Сообщение об ошибке по умолчанию для этого параметра — _«должно быть больше %{count}»_. -
:greater_than_or_equal_to- указывает, что значение должно быть больше или равно указанному значению. Сообщение об ошибке по умолчанию для этого параметра — _«должно быть больше или равно %{count}»_. -
:equal_to- указывает, что значение должно быть равно указанному значению. Сообщение об ошибке по умолчанию для этого параметра — _«должно быть равно %{count}»_. -
:less_than- указывает, что значение должно быть меньше указанного значения. Сообщение об ошибке по умолчанию для этого параметра — _«должно быть меньше %{count}»_. -
:less_than_or_equal_to- указывает, что значение должно быть меньше или равно указанному значению. Сообщение об ошибке по умолчанию для этого параметра — _«должно быть меньше или равно %{count}»_. -
:other_than- указывает, что значение не должно быть равно указанному значению. Сообщение об ошибке по умолчанию для этого параметра — _«должно отличаться от %{count}»_.
Также существует список параметров по умолчанию, поддерживаемых каждым валидатором: :if, :unless, :on, :allow_nil, :allow_blank, и :strict . Дополнительная информация в ActiveModel::Validations::ClassMethods#validates.
Валидатор требует по крайней мере одной из следующих проверок. Каждая из них может принимать proc, значение или символ, соответствующий методу:
-
:greater_than -
:greater_than_or_equal_to -
:equal_to -
:less_than -
:less_than_or_equal_to -
:other_than
Например:
class Person < ActiveRecord::Base
validates_comparison_of :birth_date, less_than_or_equal_to: -> { Date.today }
validates_comparison_of :preferred_name, other_than: :given_name, allow_nil: true
end
# File activemodel/lib/active_model/validations/confirmation.rb, line 75 def validates_confirmation_of(*attr_names) validates_with ConfirmationValidator, _merge_attributes(attr_names) end
Оборачивает проверку поля пароля или адреса электронной почты с подтверждением.
Model:
class Person < ActiveRecord::Base
validates_confirmation_of :user_name, :password
validates_confirmation_of :email_address,
message: 'should match confirmation'
end
View:
<%= password_field "person", "password" %>
<%= password_field "person", "password_confirmation" %> Добавленный атрибут password_confirmation виртуальный; он существует только как атрибут в памяти для проверки пароля. Для этого валидация добавляет методы доступа к атрибуту подтверждения.
ПРИМЕЧАНИЕ: Эта проверка выполняется только если password_confirmation не nil. Для требования подтверждения убедитесь, что добавили проверку наличия атрибута подтверждения:
validates_presence_of :password_confirmation, if: :password_changed?
Параметры конфигурации:
-
:message- пользовательское сообщение об ошибке (по умолчанию: «не совпадает с%{translated_attribute_name}»). -
:case_sensitive- Ищет точное совпадение. Игнорируется для столбцов, отличных от текстовых (по умолчаниюtrue).
Также существует список параметров по умолчанию, поддерживаемых каждым валидатором: :if, :unless, :on, :allow_nil, :allow_blank, и :strict. Дополнительная информация в ActiveModel::Validations::ClassMethods#validates.
# File activemodel/lib/active_model/validations/exclusion.rb, line 44 def validates_exclusion_of(*attr_names) validates_with ExclusionValidator, _merge_attributes(attr_names) end
Проверяет, что значение указанного атрибута не содержится в определенном перечислимом объекте.
class Person < ActiveRecord::Base
validates_exclusion_of :username, in: %w( admin superuser ), message: "You don't belong here"
validates_exclusion_of :age, in: 30..60, message: 'This site is only for under 30 and over 60'
validates_exclusion_of :format, in: %w( mov avi ), message: "extension %{value} is not allowed"
validates_exclusion_of :password, in: ->(person) { [person.username, person.first_name] },
message: 'should not be the same as your username or first name'
validates_exclusion_of :karma, in: :reserved_karmas
end
Параметры конфигурации:
-
:in- перечислимый объект элементов, которых не должно содержать значение. Может быть передан как proc, lambda или символ, возвращающий перечислимый объект. Если перечислимый объект является числовым, временным или временным диапазоном, проверка выполняется сRange#cover?, в противном случае сinclude?. При использовании proc или lambda в качестве аргумента передается экземпляр, подлежащий валидации. -
:within- синоним (или псевдоним) для:inRange#cover?, в противном случае сinclude?. -
:message- пользовательское сообщение об ошибке (по умолчанию: «зарезервировано»).
Также существует список параметров по умолчанию, поддерживаемых каждым валидатором: :if, :unless, :on, :allow_nil, :allow_blank, и :strict. Дополнительная информация в ActiveModel::Validations::ClassMethods#validates.
# File activemodel/lib/active_model/validations/format.rb, line 107 def validates_format_of(*attr_names) validates_with FormatValidator, _merge_attributes(attr_names) end
Проверяет, соответствует ли значение указанного атрибута предоставленному регулярному выражению. Вы можете потребовать, чтобы атрибут соответствовал регулярному выражению:
class Person < ActiveRecord::Base
validates_format_of :email, with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i, on: :create
end
Или потребовать, чтобы указанный атрибут не соответствовал регулярному выражению:
class Person < ActiveRecord::Base validates_format_of :email, without: /NOSPAM/ end
Также можно указать proc или лямбда-выражение, определяющие регулярное выражение для валидации атрибута.
class Person < ActiveRecord::Base
# Admin can have number as a first letter in their screen name
validates_format_of :screen_name,
with: ->(person) { person.admin? ? /\A[a-z0-9][a-z0-9_\-]*\z/i : /\A[a-z][a-z0-9_\-]*\z/i }
end
Примечание: используйте \A и \z для сопоставления начала и конца строки, ^ и $ для сопоставления начала/конца строки.
Из-за частых ошибок при использовании ^ и $, необходимо передавать опцию multiline: true, если вы используете эти два якоря в предоставленном регулярном выражении. В большинстве случаев следует использовать \A и \z.
Необходимо передать либо :with либо :without в качестве опции. Кроме того, оба значения должны быть регулярными выражениями, proc или лямбда-выражениями, иначе будет вызвано исключение.
Параметры конфигурации:
-
:message- пользовательское сообщение об ошибке (по умолчанию: «не соответствует формату»). -
:with- Регулярное выражение, соответствие которому атрибута приводит к успешной валидации. Может быть предоставлен как proc или лямбда-функция, возвращающая регулярное выражение, которое будет вызываться во время выполнения. -
:without- Регулярное выражение, несоответствие которому атрибута приводит к успешной валидации. Может быть предоставлен как proc или лямбда-функция, возвращающая регулярное выражение, которое будет вызываться во время выполнения. -
:multiline- Установите в значение true, если регулярное выражение содержит якоря, соответствующие началу или концу строк, а не началу или концу строки. Эти якоря^и$.
Также существует список параметров по умолчанию, поддерживаемых каждым валидатором: :if, :unless, :on, :allow_nil, :allow_blank, и :strict. Дополнительная информация в ActiveModel::Validations::ClassMethods#validates.
# File activemodel/lib/active_model/validations/inclusion.rb, line 42 def validates_inclusion_of(*attr_names) validates_with InclusionValidator, _merge_attributes(attr_names) end
Проверяет, находится ли значение указанного атрибута в определённом перечислимом объекте.
class Person < ActiveRecord::Base
validates_inclusion_of :role, in: %w( admin contributor )
validates_inclusion_of :age, in: 0..99
validates_inclusion_of :format, in: %w( jpg gif png ), message: "extension %{value} is not included in the list"
validates_inclusion_of :states, in: ->(person) { STATES[person.country] }
validates_inclusion_of :karma, in: :available_karmas
end
Настройки:
-
:in- Перечислимый объект доступных элементов. Может быть задан как процедура, лямбда-функция или символ, возвращающий перечислимый объект. Если перечислимый объект является числовым, временным или временным диапазоном, проверка выполняется с помощьюRange#cover?, в противном случае сinclude?. При использовании процедуры или лямбда-функции экземпляр, подлежащий валидации, передаётся в качестве аргумента. -
:within- Синоним (или псевдоним) для:in -
:message- Указывает пользовательское сообщение об ошибке (по умолчанию: «не входит в список»).
Также поддерживаются стандартные параметры всех валидаторов: :if, :unless, :on, :allow_nil, :allow_blank, и :strict. Подробнее см. ActiveModel::Validations::ClassMethods#validates.
# File activemodel/lib/active_model/validations/length.rb, line 123 def validates_length_of(*attr_names) validates_with LengthValidator, _merge_attributes(attr_names) end
Проверяет, соответствуют ли указанные атрибуты заданным ограничениям длины. Одновременно можно использовать только один параметр ограничения, за исключением :minimum и :maximum, которые можно комбинировать:
class Person < ActiveRecord::Base
validates_length_of :first_name, maximum: 30
validates_length_of :last_name, maximum: 30, message: "less than 30 if you don't mind"
validates_length_of :fax, in: 7..32, allow_nil: true
validates_length_of :phone, in: 7..32, allow_blank: true
validates_length_of :user_name, within: 6..20, too_long: 'pick a shorter name', too_short: 'pick a longer name'
validates_length_of :zip_code, minimum: 5, too_short: 'please enter at least 5 characters'
validates_length_of :smurf_leader, is: 4, message: "papa is spelled with 4 characters... don't play me."
validates_length_of :words_in_essay, minimum: 100, too_short: 'Your essay must be at least 100 words.'
private
def words_in_essay
essay.scan(/\w+/)
end
end
Параметры ограничения:
-
:minimum- Минимальная длина атрибута. -
:maximum- Максимальная длина атрибута. По умолчанию допускаетсяnil, если не используется вместе с:minimum. -
:is- Точная длина атрибута. -
:within- Диапазон, задающий минимальную и максимальную длину атрибута. -
:in- Синоним (или псевдоним) для:within.
Другие параметры:
-
:allow_nil- Атрибут может бытьnil; проверка пропускается. -
:allow_blank- Атрибут может быть пустым; проверка пропускается. -
:too_long- Сообщение об ошибке, если длина атрибута превышает максимальную (по умолчанию: «слишком длинный (максимум %{count} символов)»). -
:too_short- Сообщение об ошибке, если длина атрибута меньше минимальной (по умолчанию: «слишком короткий (минимум %{count} символов)»). -
:wrong_length- Сообщение об ошибке при использовании метода:isи неверной длине атрибута (по умолчанию: «неверная длина (должно быть %{count} символов)»). -
:message- Сообщение об ошибке для нарушения:minimum,:maximum, или:is. Псевдоним соответствующего сообщенияtoo_long/too_short/wrong_length.
Также поддерживаются стандартные параметры всех валидаторов: :if, :unless, :on, и :strict. Подробнее см. ActiveModel::Validations::ClassMethods#validates.
# File activemodel/lib/active_model/validations/numericality.rb, line 217 def validates_numericality_of(*attr_names) validates_with NumericalityValidator, _merge_attributes(attr_names) end
Проверяет, является ли значение указанного атрибута числовым, пытаясь преобразовать его в число с плавающей точкой с помощью Kernel.Float (если only_integer равно false) или применяя его к регулярному выражению /\A[+\-]?\d+\z/ (если only_integer установлено в true). Точность значений Kernel.Float гарантируется до 15 знаков.
class Person < ActiveRecord::Base validates_numericality_of :value, on: :create end
Настройки:
-
:message- Пользовательское сообщение об ошибке (по умолчанию: «не число»). -
:only_integer- Указывает, должно ли значение быть целым числом (по умолчаниюfalse). -
:only_numeric- Указывает, должно ли значение быть экземпляромNumeric(по умолчаниюfalse). По умолчанию значение пытается разобрать, если этоString. -
:allow_nil- Пропуск валидации, если атрибутnil(по умолчаниюfalse). Обратите внимание, что для столбцовIntegerиFloatпустые строки преобразуются вnil. -
:greater_than- Указывает, что значение должно быть больше заданного значения. По умолчанию сообщение об ошибке для этого параметра — _«должно быть больше %{count}»_. -
:greater_than_or_equal_to- Указывает, что значение должно быть больше или равно заданному значению. По умолчанию сообщение об ошибке для этого параметра — _«должно быть больше или равно %{count}»_. -
:equal_to- Указывает, что значение должно быть равно заданному значению. По умолчанию сообщение об ошибке для этого параметра — _«должно быть равно %{count}»_. -
:less_than- Указывает, что значение должно быть меньше заданного значения. По умолчанию сообщение об ошибке для этого параметра — _«должно быть меньше %{count}»_. -
:less_than_or_equal_to- Указывает, что значение должно быть меньше или равно заданному значению. По умолчанию сообщение об ошибке для этого параметра — _«должно быть меньше или равно %{count}»_. -
:other_than- Указывает, что значение не должно быть равно заданному значению. По умолчанию сообщение об ошибке для этого параметра — _«не должно быть равно %{count}»_. -
:odd- Указывает, что значение должно быть нечётным. По умолчанию сообщение об ошибке для этого параметра — _«должно быть нечётным»_. -
:even- Указывает, что значение должно быть чётным. По умолчанию сообщение об ошибке для этого параметра — _«должно быть чётным»_. -
:in- Проверяет, находится ли значение в заданном диапазоне. По умолчанию сообщение об ошибке для этого параметра — _«должно быть в %{count}»_.
Также поддерживаются стандартные параметры всех валидаторов: :if, :unless, :on, :allow_nil, :allow_blank, и :strict. Подробнее см. ActiveModel::Validations::ClassMethods#validates.
Следующие проверки также могут быть заданы с помощью процедуры или символа, соответствующего методу:
-
:greater_than -
:greater_than_or_equal_to -
:equal_to -
:less_than -
:less_than_or_equal_to -
:only_integer -
:other_than
Например:
class Person < ActiveRecord::Base
validates_numericality_of :width, less_than: ->(person) { person.height }
validates_numericality_of :width, greater_than: :minimum_weight
end
# File activemodel/lib/active_model/validations/presence.rb, line 34 def validates_presence_of(*attr_names) validates_with PresenceValidator, _merge_attributes(attr_names) end
Проверяет, что указанные атрибуты не пустые (как определено в Object#blank?).
class Person < ActiveRecord::Base validates_presence_of :first_name end
Атрибут first_name должен присутствовать в объекте и не быть пустым.
Если необходимо проверить наличие булевого поля (где реальные значения — true и false), используйте validates_inclusion_of :field_name, in: [true, false].
Это связано с тем, как Object#blank? обрабатывает булевы значения: false.blank? # => true.
Настройки:
-
:message- Пользовательское сообщение об ошибке (по умолчанию: «не может быть пустым»).
Также поддерживаются стандартные параметры всех валидаторов: :if, :unless, :on, :allow_nil, :allow_blank, и :strict. Подробнее см. ActiveModel::Validations::ClassMethods#validates.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.