验证一个日期时间是否晚于另一个日期时间。

3
当我尝试在模型中验证两个Datetime属性时,出现以下错误:

undefined method `to_datetime' for nil:NilClass

它突出显示了我的函数。
def validate_timings
    if (startDate > endDate)
        errors[:base] << "Start Time must be less than End Time"
    end
end

特别是使用'>'的情况。

我认为问题可能出在我处理日期的方式上,但我不确定。日期是这样传递的:

"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",

附言:我知道我的命名约定不正确,我将在下一次迁移中更改它们。

更新:这是我的完整模型。

   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

你确定 startDateendDate 不能为 nil 吗? - tessi
验证存在性:car_id,service_id,startDate,endDate - David Sigley
方法中展示的代码没有问题。故障出在其他地方,其结果是startDateendDate中的一个为空。可能是endDate,并且某些内容正在尝试将其从nil强制转换为比较。为了对此进行粗略的调试验证,请在方法顶部添加p startDate, endDate - Neil Slater
是的,看起来没有传递任何值。我原以为由于错误中的“请求”参数部分,它们会正确传递。 - David Sigley
似乎 endDatenil,没有 to_datetime 方法,你需要调试一下,找出 endDate 变成 nil 的原因。 - Малъ Скрылевъ
2个回答

1
您的比较运算符是正确的。但是,当您在datetime对象上调用此运算符时,它会尝试将右侧对象转换为另一个datetime对象。
例如:"Time.now < nil"将返回:"NoMethodError: undefined method 'to_datetime' for nil:NilClass",而不是无效日期错误。
因此,在您的情况下,您得到的错误意味着在尝试比较它们时,您没有一个适当的datetime endDate
看起来您在加载其endDate值之前调用了模型对象的验证方法。

谢谢,我的模型最后调用了validate_timings函数,但是我在Ajax中调用表单,所以问题可能出在那里。 - David Sigley
我不明白为什么Ajax会引起这样的问题。我们能看到更多你的模型代码吗? - Jean-Théo
谢谢,我已经在我的问题中添加了完整的模型。 - David Sigley
你只使用 update_appointments 方法来保存你的约会吗? - Jean-Théo

0
  1. 使用 start_date,end_date 作为属性名,这是约定俗成的。
  2. 你可以像这样使用 if 条件:if start_date && end_date && end_date > start_date ......
  3. 不要使用 "and",使用 &&。

谢谢,正如所提到的,下一次迁移将遵循命名约定。我不认为这些建议中的任何一个能解决我的问题? - David Sigley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接