如何在自定义验证中比较DateTime?

时间:2011-06-30 15:51:40

标签: ruby-on-rails validation

我正在尝试编写一个自定义验证...人们在一个站点的开始和结束时间进入,我正在尝试编写验证以检查结束后是否在开始之后。我试图将它转换为Unix时间,但后来我得到了一个noMethodError。我想将开始时间和结束时间的符号传递给此方法,然后比较两者。

  def validates_end_is_after_start(*attr_names)

    start_hour = attr_names[0].to_i
    end_hour = attr_names[1].to_i

问题是这最终会出现符号的noMethodError。但该符号指向DateTime对象(我认为),如何访问该对象?我认为对于一般的符号我有些不明白的地方。

2 个答案:

答案 0 :(得分:2)

您可以使用可以访问类型转换日期的validate方法

class Something < ActiveRecord::Base

  validate :valid_dates

  def valid_dates
    if start_time >= end_time
      self.errors.add :start_time, ' has to be after end time'
    end
  end

end

答案 1 :(得分:0)

将符号看作字符串,但作为对象的功能和行为要少得多。您应该将代码更改为以下内容:

def validates_end_is_after_start(*attr_names)
  start_hour = self.send(attr_names[0].to_sym).to_i
  end_hour = self.send(attr_names[1].to_sym).to_i
  # ... more code here
end

你还应该检查出令人敬畏的宝石validates_timeliness,这是为了处理日期,时间和日期时间的验证。