【问题标题】:How do I prevent strptime from throwing an error if my date isn't present or in the right format?如果我的日期不存在或格式不正确,如何防止 strptime 引发错误?
【发布时间】:2016-06-20 19:26:16
【问题描述】:

我使用的是 Rails 4.2.3。在我的控制器中,当我要保存实体时,我有这个

    @date = Date.strptime(my_object_params[:day], "%m/%d/%Y")
    @my_object.day = @date
        respond_to do |format|
      if @my_object.save

很遗憾,如果参数不包含或与格式不匹配,我会收到此错误

ArgumentError (invalid date):
  app/controllers/my_objects_controller.rb:33:in `strptime'
  app/controllers/my_objects_controller.rb:33:in `create'

如果格式不正确,我如何防止 Rails 死机?我已经在我的模型中包含了这个验证规则,虽然我认为它还没有到那个阶段,因为我的“保存”直到在方法的后面才被调用......

  validates_presence_of :day

【问题讨论】:

  • 您的错误堆栈跟踪有一些行号,您的代码中的哪些行是这些?这就是整个堆栈跟踪吗?

标签: validation ruby-on-rails-4 controller date-format strptime


【解决方案1】:

我建议您在这种情况下简单地添加一些错误处理。比如:

@date = Date.strptime(my_object_params[:day], "%m/%d/%Y") rescue nil

然后处理@date为nil的情况。

【讨论】:

  • 这不起作用。我用你的替换了我的行,但它仍然导致我在问题中列出的相同错误(“ArgumentError(无效日期)”)
  • 那么您的错误不是由该行引起的。如果它在哪里,@date 实例将为 nil。
【解决方案2】:

尝试更具体地处理错误?

begin
  @date = Date.strptime(my_object_params[:day], "%m/%d/%Y")
rescue ArgumentError => ae
  #do something rational and valid
end

【讨论】:

    猜你喜欢
    • 2017-05-11
    • 2012-12-13
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 2021-01-27
    相关资源
    最近更新 更多