我想我可能在做梦,但我想我在某个地方读到你可以在保存之前验证对象属性的类型?某物
比如validates :transaction_date, :type => Date
,这会确保它是一个日期吗?
这是否可以在Rails 3.2中使用?我试图在网上找到这方面的证据。我已经看过rails api了,我正在浏览ActiveRecord support。
答案 0 :(得分:12)
作为其他答案的补充,请注意您可以定义自定义验证器,以便您使用您提议的语法:
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?
。
答案 1 :(得分:6)
Rails不直接支持这一点;它最接近的可能是validates_format_of,或者提供你自己的自定义验证器。
我认为你想要的是validates_timeliness宝石。它不仅验证某些内容是有效日期,而且您可以指定它是在今天之前还是之后以及其他各种日期范围检查。
答案 2 :(得分:2)
答案 3 :(得分:1)
已经创建了一个新的gem来帮助validate types in rails和explanatory blog post来回答更多因为它首先创建的“原因”。
使用此库,您的代码很简单:
class Post < ActiveRecord::Base
validates_type :transaction_date, :date
end
如果将Date
以外的任何内容分配给:transaction_date
,则会引发异常。
答案 4 :(得分: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