ActiveRecord:如果值无效则中止日期时间解析
ActiveRecord: abort datetime parsing if value is invalid
我的 ActiveRecord 模型(在 Rails 中)中有一个日期时间字段,我需要保护我的模型在日期字段超出范围时不会崩溃。
我发现了 this 个问题,并试图做出类似的回答:
class Something < ActiveRecord::Base
validate :important_date_is_valid_datetime, on: :create
validates :important_date, presence: true
private
def important_date_is_valid_datetime
if (DateTime.parse(important_date.to_s()) rescue ArgumentError) == ArgumentError then
errors.add(:important_date, 'must be a valid datetime')
end
end
end
此代码可以 'validate' 日期时间字段,但如果值超出范围,它不会中止字段解析:
irb(main):007:0> Something.new(important_date: "2015-20-40").valid?
ArgumentError: argument out of range
from /home/shau-kote/.gem/ruby/2.1.0/gems/activesupport-4.2.0/lib/active_support/values/time_zone.rb:350:in `initialize'
from /home/shau-kote/.gem/ruby/2.1.0/gems/activesupport-4.2.0/lib/active_support/values/time_zone.rb:350:in `new'
from /home/shau-kote/.gem/ruby/2.1.0/gems/activesupport-4.2.0/lib/active_support/values/time_zone.rb:350:in `parse'
...
我可以防止类似的崩溃吗?
这是 Rails 4 的一个问题,在您的验证器被调用之前异常就被抛出。有一个 pull request 可以恢复 Rails 3 的行为,其中无效日期仅为零。此拉取请求似乎已合并,因此更新您的 Rails 版本可能已经可以解决问题。
与此同时,我可以想到两个解决方法:首先,您可以使用客户端验证,如果需要,当然可以对其进行篡改,但可以保护 "good faith" 中使用您的应用程序的用户,其次,而不是使用验证,您可以在参数用于设置 datetime 属性之前检查控制器中的有效日期(或分别为 ArgumentError)。这两个选项都不是最佳选择,但应该可以防止更多崩溃。
我的 ActiveRecord 模型(在 Rails 中)中有一个日期时间字段,我需要保护我的模型在日期字段超出范围时不会崩溃。
我发现了 this 个问题,并试图做出类似的回答:
class Something < ActiveRecord::Base
validate :important_date_is_valid_datetime, on: :create
validates :important_date, presence: true
private
def important_date_is_valid_datetime
if (DateTime.parse(important_date.to_s()) rescue ArgumentError) == ArgumentError then
errors.add(:important_date, 'must be a valid datetime')
end
end
end
此代码可以 'validate' 日期时间字段,但如果值超出范围,它不会中止字段解析:
irb(main):007:0> Something.new(important_date: "2015-20-40").valid?
ArgumentError: argument out of range
from /home/shau-kote/.gem/ruby/2.1.0/gems/activesupport-4.2.0/lib/active_support/values/time_zone.rb:350:in `initialize'
from /home/shau-kote/.gem/ruby/2.1.0/gems/activesupport-4.2.0/lib/active_support/values/time_zone.rb:350:in `new'
from /home/shau-kote/.gem/ruby/2.1.0/gems/activesupport-4.2.0/lib/active_support/values/time_zone.rb:350:in `parse'
...
我可以防止类似的崩溃吗?
这是 Rails 4 的一个问题,在您的验证器被调用之前异常就被抛出。有一个 pull request 可以恢复 Rails 3 的行为,其中无效日期仅为零。此拉取请求似乎已合并,因此更新您的 Rails 版本可能已经可以解决问题。
与此同时,我可以想到两个解决方法:首先,您可以使用客户端验证,如果需要,当然可以对其进行篡改,但可以保护 "good faith" 中使用您的应用程序的用户,其次,而不是使用验证,您可以在参数用于设置 datetime 属性之前检查控制器中的有效日期(或分别为 ArgumentError)。这两个选项都不是最佳选择,但应该可以防止更多崩溃。