跳至内容 跳至搜索
方法
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 或包含 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 - 指定值必须大于所提供的值。此选项的默认错误消息是 _“必须大于 %{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/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 或返回可枚举对象的符号提供。如果可枚举对象是数字、时间或日期时间范围,则使用 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 提供,并在运行时调用。

  • :without - 如果属性不匹配该正则表达式,则验证成功。这可以作为返回正则表达式的 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 或返回可枚举对象的符号提供。如果可枚举对象是数字、时间或日期时间范围,则使用 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

也别名为:validates_size_of
# 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)

通过尝试将指定属性的值转换为浮点数(如果 only_integerfalse)或将其应用于正则表达式 /\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)。默认行为是尝试解析字符串值。

  • :allow_nil - 如果属性为 nil,则跳过验证(默认为 false)。请注意,对于 IntegerFloat 列,空字符串会被转换为 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

以下检查也可以作为 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)