Ruby on rails 如何在RubyonRails中实现自定义日期验证

Ruby on rails 如何在RubyonRails中实现自定义日期验证,ruby-on-rails,validation,date,Ruby On Rails,Validation,Date,我试图按照Rails指南中的示例来实现自定义验证,但我似乎无法使其用于验证日期 以下是迁移: class CreateSetLists < ActiveRecord::Migration def change create_table :set_lists do |t| t.date :show_date t.string :show_name t.timestamps end end class CreateSetListm

我试图按照Rails指南中的示例来实现自定义验证,但我似乎无法使其用于验证日期

以下是迁移:

class CreateSetLists < ActiveRecord::Migration
  def change
    create_table :set_lists do |t|
      t.date :show_date
      t.string :show_name

      t.timestamps
    end
  end
class CreateSetList
结束

模型如下:

class SetList < ActiveRecord::Base
  validates :show_date, :show_name, presence: true
  validate :must_have_valid_future_date

  private

  def must_have_valid_future_date
    if show_date.present?
        unless show_date.is_a?(Date)
            errors.add(:show_date, "must be a valid date")
        end

        if show_date < Date.today
            errors.add(:show_date, "can't be in the past")
        end
    end
  end

end
class SetList
当我试图通过提交一个无效的日期来测试这一点时,我的对象的错误哈希会显示一条消息,就好像从未设置过日期一样。如果我删除了“状态”验证,那么当我提交一个无效的日期时,对象只需将日期保存为nil

验证我是否有丢失的有效日期有什么特别之处吗

更新(2015-12-07上午11:45):

我注意到控制台中出现了这样的情况:

irb(main):044:0> msl=SetList.new
=> #<SetList id: nil, show_name: nil, show_date: nil, created_at: nil, updated_at: nil>
irb(main):045:0> msl.show_date="invalid"
=> "invalid"
irb(main):046:0> msl.show_date
=> nil
irb(main):044:0>msl=SetList.new
=> #
irb(主):045:0>msl.show\u date=“无效”
=>“无效”
irb(主):046:0>msl.show\u日期
=>零
Rails似乎不允许我验证我是否有有效的日期。它只会丢弃无效的日期,并将字段设置为零

对于类型为Date的属性,这是列类型的某个属性吗?这是我可以依赖的行为,因此无需验证我是否有有效日期(因为Rails会自动丢弃无效日期)

更新(2015-12-07晚上8:04):

这个问题似乎意味着我可以指望Rails在我的模型中不需要任何验证就可以丢弃无效日期:


有时,如果分离逻辑,调试边缘情况会更容易。也许是朝着这个方向:

def must_have_valid_future_date
  valid_date and future_date
end

def valid_date
  errors.add(:show_date, "must be a valid date") unless show_date.is_a?(Date)
end

def future_date
  errors.add(:show_date, "can't be in the past") if show_date < Date.today
end
def必须具有有效的未来日期
有效日期和未来日期
结束
def有效期
错误。添加(:show_date,“必须是有效日期”),除非show_date。是?(日期)
结束
未来日期
错误。如果show_date
如果我删除了“状态”验证,那么当我提交一个无效的日期时,对象只需将日期保存为nil

发生这种情况的原因是
必须\u具有有效的\u future\u date
方法未返回布尔值。或者更确切地说,它从不返回false,因此允许通过nil


似乎没有必要对日期属性执行验证以确保条目为有效日期。如果提交的值不是有效日期,rails会将其丢弃,并在调用任何验证方法之前将属性设置为nil。

我认为我的验证方法不需要返回false(或任何内容)。来自ActiveModel::Validations文档:“请注意,验证方法的返回值不相关。无法停止验证回调链。”