在rails模型中一起验证日期和时间字段

时间:2012-03-31 12:45:54

标签: ruby-on-rails-3 validation datetime datepicker activemodel

编辑:如果下面的问题看起来有点'广泛',总结是我只想在我的模型中结合日期字段和可选时间字段纯粹是为了使用日期验证器验证它但我当我传入一个字符串作为时间时,无法让我的测试失败。


编辑2:因为我仍在努力寻找一种方法来加入一个带有时间对象的日期对象以进行验证,所以我想知道我是否可以使用{{1来验证时间值是一个时间对象(而不是一个无效的字符串),但似乎也没有工作,我想知道是否是因为Time mention with this method(但我不太明白它是否足以知道是否会导致问题或不

我也想知道to_time method是否可以帮助我检查某些东西是否属于Time对象,但我不确定如何。

希望有人可以建议如何使用is_a?(Time)对象加入Date对象以进行验证,或者至少告诉我如何检查提交的时间值是一个Time对象,而不是无效的字符串或其他内容。


编辑3:我刚刚根据我发现的另一个答案尝试了以下内容,但它仍然没有抱怨测试中的“无效”字符串:

Time

是否有任何理由可以将字符串视为有效的validate :start_time_is_time?, :if => "start_time.present?" def start_time_is_time? unless start_time.is_a?(Time) || ((Time.parse(start_time) rescue ArgumentError) == ArgumentError) errors.add(:start_time, 'must be a valid time') end end


我有一个类似于Trying to set a variable in before_validation but it isn't working的视图,其中的视图使用日历来选择日期和下拉以选择时间。我试着将同样的东西应用到我的模型中,但由于我对红宝石有点新意而无法填写答案留下的空白,所以无法将其应用到模型中。

我的模型有start_date和start_time字段。

我需要组合这两个字段,以便我可以将它们一起验证为日期时间(使用date_validator gem),而不是必须单独验证日期和时间,尽管它们将作为单独的字段进入数据库,除非有人可以说服我(尽管我已经分别做了很多,所以不要真的想改变它)。

必须提交日期,但时间字段是可选的。

从另一个问题看,我需要一个before_validation方法,可以将需要的2个字段组合成一个虚拟字段,然后我可以使用date_validator gem进行验证。

编辑:由于RyanJM,原始错误已得到纠正,但我仍然无法让测试正确传递。以下是目前的状态。

以下是我的Showtime模型的基础知识:

Time

如果需要,这是性能模型的基础/相关部分:

class Showtime < ActiveRecord::Base

  attr_accessible   :start_date, :start_time

  attr_accessor   :starting_at, :starting_time

  belongs_to :performance

  before_validation :construct_starting_at

  validates :start_date,  :presence => true,  :date => { :after_or_equal_to => Proc.new { Date.today } }
  validates :starting_at, :date => { :after_or_equal_to => Proc.new { Time.now } }, :if => "start_date.present? && start_time.present?"

  def construct_starting_at
    if start_date.present? && start_time.present?
      self.starting_time = self.start_time.strftime("%T")
      self.starting_at = DateTime.strptime("#{start_date} #{starting_time}", "%F %T")
    end
  end

end

这是失败的测试:

class Performance < ActiveRecord::Base

  has_many :showtimes, :dependent => :delete_all
  accepts_nested_attributes_for :showtimes, :allow_destroy => true, :reject_if => lambda { |a| a[:start_date].blank? }

end

希望我在上面的代码中没有破坏任何东西,试图展示必要的部分。

2 个答案:

答案 0 :(得分:0)

我没有使用过date_validator gem,但validates_timeliness做得很好,而且似乎也更积极地维护。

答案 1 :(得分:0)