我想我可能在做梦,但我想我在某处读到,您可以在保存对象之前验证对象属性的类型?类似的东西validates :transaction_date, :type => Date
,这将确保它的日期?
这在 Rails 3.2 中可行吗?我试图在网上找到这方面的证据。我已经在这里查看了rails api,并且正在通过 ActiveRecord 支持。
我想我可能在做梦,但我想我在某处读到,您可以在保存对象之前验证对象属性的类型?类似的东西validates :transaction_date, :type => Date
,这将确保它的日期?
这在 Rails 3.2 中可行吗?我试图在网上找到这方面的证据。我已经在这里查看了rails api,并且正在通过 ActiveRecord 支持。
作为对其他答案的补充,请注意,您可以定义一个自定义验证器,让您完全使用您建议的语法:
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?
.
Rails 不直接支持这一点。最接近的可能是 validates_format_of,或者提供您自己的自定义验证器。
我认为您想要的是validates_timeliness gem。它不仅验证某事是有效日期,而且您可以指定它应该在今天之前还是之后以及各种其他日期范围检查。
已经创建了一个新 gem 来帮助验证 rails 中的类型,并且存在解释性博客文章来回答更多首先创建它的“原因”。
使用这个库,您的代码将很简单:
class Post < ActiveRecord::Base
validates_type :transaction_date, :date
end
Date
当除 aa 之外的任何内容被分配给.时,这将引发异常:transaction_date
。
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