跳至内容 跳至搜索
方法
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

# 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

# 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
# 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

# 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

# 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

# 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

# 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

# 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_integerfalse)将其转换为浮点数,或者将其应用于正则表达式 /\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)。请注意,对于 IntegerFloat 列,空字符串将转换为 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
# 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 属性必须在对象中,并且不能为空。

如果您想验证布尔字段的存在(其中真实值为 truefalse),则需要使用 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

# File activemodel/lib/active_model/validations/presence.rb, line 34
def validates_presence_of(*attr_names)
  validates_with PresenceValidator, _merge_attributes(attr_names)
end

validates_size_of(*attr_names)