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

jac*_*cob 5 validation ruby-on-rails ruby-on-rails-3

验证结束日期不在开始日期之前的最佳方法是什么,开始日期是在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>
Run Code Online (Sandbox Code Playgroud)

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

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

Jer*_*ome 11

@YaBoyQuy客户端验证可以工作,避免受到服务器的攻击......

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

validates :end_date, presence: true, date: { after_or_equal_to:  :start_date}
Run Code Online (Sandbox Code Playgroud)

的建议

on: :create
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这个答案非常可读,但它需要 `date_validator` 验证 gem。它在普通 Rails 中不可用。 (2认同)

Jos*_*ter 6

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

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

在您的模型中

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
Run Code Online (Sandbox Code Playgroud)


YaB*_*Quy 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
Run Code Online (Sandbox Code Playgroud)


ver*_*as1 3

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

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

def date_validation
  if self[:end_date] < self[:start_date]
    errors[:end_date] << "Error message"
    return false
  else
    return true
  end
end
Run Code Online (Sandbox Code Playgroud)

Rails >= 7.0 使其成为单行代码

validates_comparison_of :end_date, greater_than_or_equal_to: :end_date

公关,导轨指南