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验证是不正确的; 从逻辑上讲,这也应该在编辑上运行.
我基于简洁的语法进行了投票.
我发现这是最清晰的阅读:
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)
避免客户端验证,因为它只验证客户端...使用内置的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)
如果您需要客户端验证,请使用 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
归档时间: |
|
查看次数: |
10344 次 |
最近记录: |