Rails验证类型日期?

时间:2013-09-16 15:32:38

标签: ruby-on-rails validation activerecord

我想我可能在做梦,但我想我在某个地方读到你可以在保存之前验证对象属性的类型?某物 比如validates :transaction_date, :type => Date,这会确保它是一个日期吗?

这是否可以在Rails 3.2中使用?我试图在网上找到这方面的证据。我已经看过rails api了,我正在浏览ActiveRecord support

5 个答案:

答案 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)

您可以使用以下gem:

https://github.com/codegram/date_validator

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

答案 3 :(得分:1)

已经创建了一个新的gem来帮助validate types in railsexplanatory 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