- V
实例公共方法
validates_absence_of(*attr_names) 链接
验证指定的属性为空(由 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
。
来源:显示 | 在 GitHub 上
# File activemodel/lib/active_model/validations/absence.rb, line 28 def validates_absence_of(*attr_names) validates_with AbsenceValidator, _merge_attributes(attr_names) end
validates_acceptance_of(*attr_names) 链接
封装想要验证接受服务条款复选框(或类似协议)的模式。
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
,因为该属性在验证前从 “1” 类型转换为true
。
每个验证器还支持一个默认选项列表::if
、:unless
、:on
、:allow_nil
、:allow_blank
和 :strict
。有关更多信息,请参阅 ActiveModel::Validations::ClassMethods#validates
。
来源:显示 | 在 GitHub 上
# File activemodel/lib/active_model/validations/acceptance.rb, line 108 def validates_acceptance_of(*attr_names) validates_with AcceptanceValidator, _merge_attributes(attr_names) end
validates_comparison_of(*attr_names) 链接
验证指定属性的值是否满足与另一个值、过程或属性的所有定义比较。
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
。
验证器需要提供以下至少一项检查。每个检查都将接受一个过程、值或一个对应于方法的符号
-
: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
来源: 显示 | 在 GitHub 上
# File activemodel/lib/active_model/validations/comparison.rb, line 85 def validates_comparison_of(*attr_names) validates_with ComparisonValidator, _merge_attributes(attr_names) end
validates_confirmation_of(*attr_names) 链接
封装了使用确认验证密码或电子邮件地址字段的模式。
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
。
来源:显示 | 在 GitHub 上
# File activemodel/lib/active_model/validations/confirmation.rb, line 75 def validates_confirmation_of(*attr_names) validates_with ConfirmationValidator, _merge_attributes(attr_names) end
validates_exclusion_of(*attr_names) 链接
验证指定属性的值不在特定可枚举对象中。
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
-:in
的同义词(或别名)Range#cover?
,否则使用include?
。 -
:message
- 指定自定义错误消息(默认值为:“已保留”)。
每个验证器还支持一个默认选项列表::if
、:unless
、:on
、:allow_nil
、:allow_blank
和 :strict
。有关更多信息,请参阅 ActiveModel::Validations::ClassMethods#validates
。
来源:显示 | 在 GitHub 上
# File activemodel/lib/active_model/validations/exclusion.rb, line 44 def validates_exclusion_of(*attr_names) validates_with ExclusionValidator, _merge_attributes(attr_names) end
validates_format_of(*attr_names) 链接
验证指定属性的值是否具有正确的形式,根据提供的正则表达式。你可以要求属性与正则表达式匹配
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 或 lambda,它将确定用于验证属性的正则表达式。
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
作为选项。此外,两者都必须是正则表达式、过程或 lambda,否则将引发异常。
配置选项
-
:message
- 自定义错误消息(默认值为:“无效”)。 -
:with
- 如果属性匹配,则正则表达式将导致验证成功。这可以作为返回正则表达式的过程或 lambda 提供,该正则表达式将在运行时调用。 -
:without
- 如果属性不匹配,则正则表达式将导致验证成功。这可以作为返回正则表达式的过程或 lambda 提供,该正则表达式将在运行时调用。 -
:multiline
- 如果你的正则表达式包含与字符串开头或结尾相反的行开头或结尾匹配的锚点,则设置为 true。这些锚点是^
和$
。
每个验证器还支持一个默认选项列表::if
、:unless
、:on
、:allow_nil
、:allow_blank
和 :strict
。有关更多信息,请参阅 ActiveModel::Validations::ClassMethods#validates
。
来源:显示 | 在 GitHub 上
# File activemodel/lib/active_model/validations/format.rb, line 107 def validates_format_of(*attr_names) validates_with FormatValidator, _merge_attributes(attr_names) end
validates_inclusion_of(*attr_names) 链接
验证指定属性的值是否在特定可枚举对象中可用。
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
- 可用项的可枚举对象。这可以作为返回可枚举的 proc、lambda 或符号提供。如果可枚举对象是数字、时间或日期时间范围,则使用Range#cover?
执行测试,否则使用include?
。使用 proc 或 lambda 时,将验证中的实例作为参数传递。 -
:within
-:in
的同义词(或别名) -
:message
- 指定自定义错误消息(默认值为:“未包含在列表中”)。
每个验证器还支持一个默认选项列表::if
、:unless
、:on
、:allow_nil
、:allow_blank
和 :strict
。有关更多信息,请参阅 ActiveModel::Validations::ClassMethods#validates
。
来源:显示 | 在 GitHub 上
# File activemodel/lib/active_model/validations/inclusion.rb, line 42 def validates_inclusion_of(*attr_names) validates_with InclusionValidator, _merge_attributes(attr_names) end
validates_length_of(*attr_names) 链接
验证指定的属性是否符合提供的长度限制。一次只能使用一个约束选项,但可以将 :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
- 属性的最大大小。如果未与:minimum
一起使用,则默认允许nil
。 -
: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
。
来源:显示 | 在 GitHub 上
# File activemodel/lib/active_model/validations/length.rb, line 123 def validates_length_of(*attr_names) validates_with LengthValidator, _merge_attributes(attr_names) end
validates_numericality_of(*attr_names) 链接
通过尝试使用 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
来源:显示 | 在 GitHub 上
# File activemodel/lib/active_model/validations/numericality.rb, line 217 def validates_numericality_of(*attr_names) validates_with NumericalityValidator, _merge_attributes(attr_names) end
validates_presence_of(*attr_names) 链接
验证指定的属性不为空(由 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
。
来源:显示 | 在 GitHub 上
# File activemodel/lib/active_model/validations/presence.rb, line 34 def validates_presence_of(*attr_names) validates_with PresenceValidator, _merge_attributes(attr_names) end