6

我想我可能在做梦,但我想我在某处读到,您可以在保存对象之前验证对象属性的类型?类似的东西validates :transaction_date, :type => Date,这将确保它的日期?

这在 Rails 3.2 中可行吗?我试图在网上找到这方面的证据。我已经在这里查看了rails api,并且正在通过 ActiveRecord 支持

4

5 回答 5

17

作为对其他答案的补充,请注意,您可以定义一个自定义验证器,让您完全使用您建议的语法:

validates :transaction_date, :type => Date

如下:

class TypeValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    record.errors.add attribute, (options[:message] || "is not of class #{options[:with]}") unless
      value.class == options[:with]
  end
end

当然,如果您想允许子类,您可以将测试更改为使用kind_of?.

于 2013-09-16T16:33:51.563 回答
6

Rails 不直接支持这一点。最接近的可能是 validates_format_of,或者提供您自己的自定义验证器。

我认为您想要的是validates_timeliness gem。它不仅验证某事是有效日期,而且您可以指定它应该在今天之前还是之后以及各种其他日期范围检查。

于 2013-09-16T15:36:24.527 回答
2

您可以使用以下宝石:

https://github.com/codegram/date_validator

它包含一个日期验证器。您可以添加一些选项。

于 2013-09-16T15:35:13.040 回答
1

已经创建了一个新 gem 来帮助验证 rails 中的类型,并且存在解释性博客文章来回答更多首先创建它的“原因”。

使用这个库,您的代码将很简单:

class Post < ActiveRecord::Base
  validates_type :transaction_date, :date
end

Date当除 aa 之外的任何内容被分配给.时,这将引发异常:transaction_date

于 2015-07-18T23:57:11.487 回答
0

is_a?这是另一个使用代替的自定义验证器,class因此不那么严格并处理诸如Numeric

class IsAValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    record.errors.add attribute, (options[:message] || "is not a #{options[:with]}") unless
      value.is_a?(options[:with])
  end
end

用法:

validates :number, is_a: Numeric
于 2021-07-14T14:18:46.917 回答