- 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
,因为属性在验证之前从“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) 链接
验证指定属性的值是否满足所有定义的与另一个值、proc 或属性的比较。
class Person < ActiveRecord::Base
validates_comparison_of :value, greater_than: 'the sum of its parts'
end
配置选项
-
:message
- 自定义错误消息(默认是: “比较失败”)。 -
:greater_than
- 指定该值必须大于提供的 value。此选项的默认错误消息是_“必须大于 %{count}”_。 -
:greater_than_or_equal_to
- 指定该值必须大于或等于提供的 value。此选项的默认错误消息是_“必须大于或等于 %{count}”_。 -
:equal_to
- 指定该值必须等于提供的 value。此选项的默认错误消息是_“必须等于 %{count}”_。 -
:less_than
- 指定该值必须小于提供的 value。此选项的默认错误消息是_“必须小于 %{count}”_。 -
:less_than_or_equal_to
- 指定该值必须小于或等于提供的 value。此选项的默认错误消息是_“必须小于或等于 %{count}”_。 -
:other_than
- 指定该值必须不等于提供的 value。此选项的默认错误消息是_“必须不同于 %{count}”_。
此外,还有每个验证器支持的默认选项列表::if
、:unless
、:on
、:allow_nil
、:allow_blank
和 :strict
。有关更多信息,请参见 ActiveModel::Validations::ClassMethods#validates
。
验证器要求提供以下至少一项检查。每个检查都接受一个 proc、value 或一个对应于方法的 symbol
-
: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 或 symbol 提供,该 symbol 返回一个枚举。如果枚举是数值、时间或日期时间范围,则测试使用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
作为选项。此外,两者都必须是正则表达式或 proc 或 lambda,否则会引发异常。
配置选项
-
:message
- 自定义错误消息(默认是: “无效”)。 -
:with
- 如果属性匹配将导致验证成功的正则表达式。这可以作为 proc 或 lambda 提供,在运行时调用 proc 或 lambda 返回正则表达式。 -
:without
- 如果属性不匹配将导致验证成功的正则表达式。这可以作为 proc 或 lambda 提供,在运行时调用 proc 或 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 或 symbol 提供,该 symbol 返回一个枚举。如果枚举是数值、时间或日期时间范围,则测试使用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
),验证指定属性的值是否为数字。
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
- 指定该值必须大于提供的 value。此选项的默认错误消息是_“必须大于 %{count}”_。 -
:greater_than_or_equal_to
- 指定值必须大于或等于所提供的值。此选项的默认错误消息为“必须大于或等于 %{count}”。 -
:equal_to
- 指定该值必须等于提供的 value。此选项的默认错误消息是_“必须等于 %{count}”_。 -
:less_than
- 指定该值必须小于提供的 value。此选项的默认错误消息是_“必须小于 %{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
。
以下检查也可以使用 proc 或与方法相对应的符号提供
-
: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