【问题标题】:Rails validate type date?Rails 验证类型日期?
【发布时间】:2013-09-16 15:32:37
【问题描述】:

我想我可能是在做梦,但我想我在某处读到过,您可以在保存对象之前验证它的属性类型?某物 像validates :transaction_date, :type => Date 这样就可以确定约会了吗?

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

【问题讨论】:

标签: ruby-on-rails validation activerecord


【解决方案1】:

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

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 中。
【解决方案2】:

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

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

【讨论】:

  • 我们使用 validates_timeliness,它非常适合我们的目的。 +1
【解决方案3】:

您可以使用以下 gem:

https://github.com/codegram/date_validator

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

【讨论】:

    【解决方案4】:

    已经创建了一个新的 gem 来帮助 validate types in rails 和一个 explanatory blog post 来回答更多最初创建它的“原因”。

    有了这个库,你的代码就很简单了:

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

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

    【讨论】:

      【解决方案5】:

      这是另一个使用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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-29
        • 2011-08-05
        • 1970-01-01
        • 1970-01-01
        • 2011-08-25
        • 1970-01-01
        相关资源
        最近更新 更多