验证结束日期不在开始日期之前的最佳方法是什么,开始日期是在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吗?
答案 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