验证一个日期时间晚于另一个日期时间

时间:2013-12-18 10:29:38

标签: ruby datetime ruby-on-rails-4

当我尝试在模型中验证两个Datetime属性时,我得到以下结果:

  

nil的未定义方法`to_datetime':NilClass

它突出了我的功能

def validate_timings
    if (startDate > endDate)
        errors[:base] << "Start Time must be less than End Time"
    end
end

特别是使用'&gt;'

我认为这可能是我处理日期的方式,但我不确定。这是日期的通过方式:

"startDate(1i)"=>"2013",
 "startDate(2i)"=>"12",
 "startDate(3i)"=>"18",
 "startDate(4i)"=>"10",
 "startDate(5i)"=>"24",
 "endDate(1i)"=>"2013",
 "endDate(2i)"=>"12",
 "endDate(3i)"=>"18",
 "endDate(4i)"=>"11",
 "endDate(5i)"=>"24",

P.S我知道我的命名约定不正确,我会在下次迁移中更改它们。

更新:这是我的完整型号

   class Appointment < ActiveRecord::Base
    belongs_to :car
    belongs_to :service
    accepts_nested_attributes_for :service
    accepts_nested_attributes_for :car

    attr_accessor :period, :frequency, :commit_button

    validates_presence_of :car_id, :service_id, :startDate, :endDate
    validate :validate_timings


    def validate_timings
        p startDate, endDate
        if (startDate > endDate)
            errors[:base] << "Start Time must be less than End Time"
        end
    end

    def update_appointments(appointments, appointment)
        appointments.each do |e|
            begin
                st, et = e.startDate, e.endDate
            e.attributes = appointment

            nst = DateTime.parse("#{e.startDate.hour}:#{e.startDate.min}:#{e.startDate.sec}, #{st.day}-#{st.month}-#{st.year}")
            net = DateTime.parse("#{e.end.hour}:#{e.end.min}:#{e.end.sec}, #{et.day}-#{et.month}-#{et.year}")
            #puts "#{nst}           :::::::::          #{net}"
            rescue
            nst = net = nil
        end
        if nst and net
            #          e.attributes = appointment
            e.startDate, e.endDate = nst, net


           e.save
        end
    end

  end
end

2 个答案:

答案 0 :(得分:1)

您的比较运算符是正确的。但是,当您在datetime对象上调用此运算符时,它会尝试将右侧对象转换为另一个datetime对象。

即:“Time.now&lt; nil”将返回: “NoMethodError:未定义的方法`to_datetime'代表nil:NilClass”而不是无效的日期错误。

因此,在您的情况下,您获得的错误意味着当您尝试比较它们时,您没有正确的日期时间 endDate

在您的模型对象有时间加载其endDate值之前,您似乎调用了验证方法。

答案 1 :(得分:0)

  1. 使用start_date,end_date作为属性名称。这是惯例
  2. 你可以使用if if start_date&amp;&amp; end_date&amp;&amp; end_date&gt; start_date .....
  3. 不要使用“和”。使用&amp;&amp;