如何验证开始日期和结束日期?

时间:2012-08-30 14:12:57

标签: ruby-on-rails ruby-on-rails-3 validation

验证结束日期不在开始日期之前的最佳方法是什么,开始日期是在Rails结束日期之后?

我在视图控制器中有这个:

<tr>
    <td><%= f.label text="Starts:" %></td>
    <td><%= f.datetime_select :start_date, :order => [:day, :month, :year]%></td>
</tr>
<tr>
    <td><%= f.label text="Ends:" %></td>
    <td><%= f.datetime_select :end_date,:order => [:day, :month, :year]</td>
</tr>

我希望它能够提供各种类型的弹出窗口,并提供有意义的信息。

我想创建一个泛型方法,它接受两个参数,即开始日期和结束日期,然后我可以在我的viewcontroller中调用它们;上面代码中的fx。或者,我需要使用jQuery吗?

5 个答案:

答案 0 :(得分:11)

@YaBoyQuy 客户端验证可以工作并避免命中服务器......

问题还在于end_date在开始之后,因此验证也应该说明

validates :end_date, presence: true, date: { after_or_equal_to:  :start_date}

的建议
on: :create

对于end_date验证不正确;从逻辑上讲,这也应该在编辑上运行。

我基于简洁的语法进行了投票。

答案 1 :(得分:5)

避免客户端验证,因为它只验证客户端... 使用内置的rails验证器。

  validates :start_date, presence: true, date: { after_or_equal_to: Proc.new { Date.today }, message: "must be at least #{(Date.today + 1).to_s}" }, on: :create
  validates :end_date, presence: true

答案 2 :(得分:4)

清洁和清除(并在控制之下?)

我发现这是最清楚的阅读:

在您的模型中

validates_presence_of :start_date, :end_date

validate :end_date_is_after_start_date


#######
private
#######

def end_date_is_after_start_date
  return if end_date.blank? || start_date.blank?

  if end_date < start_date
    errors.add(:end_date, "cannot be before the start date") 
  end 
end

答案 3 :(得分:2)

如果您想要客户端验证,请使用jQuery。

或者在rails中,为了验证服务器端,您可以创建自己的猜测吗?

def date_validation
  if self[:end_date] < self[:start_date]
    errors[:end_date] << "Error message"
    return false
  else
    return true
  end
end

答案 4 :(得分:2)

要使用validates :dt_end, :date => {:after_or_equal_to => :dt_start},您需要DateValidator,例如:


class DateValidator > ActiveModel::Validator
  def validate(record)
    the_end = record.dt_end
    the_start = record.dt_start
    if the_end.present?
      if the_end < the_start
        record.errors[:dt_end] << "The end date can't be before the start date. Pick a date after #{the_start}"
      end
    end
  end
end