使用try的Ruby字符串日期to_date会产生无效日期

时间:2014-09-30 15:15:02

标签: ruby rescue to-date

我想尝试从params到日期格式的日期,如果它不能,那么我想将它分配给今天一年的日期。

这就是我的尝试。

valid_until = params[:valid_until].try(:to_date) || Date.today.next_year

try方法很酷,因为如果:valid_until日期为零,则只返回nil。我发现的是,如果某人的日期无效,例如" 4790224374"然后它将返回ArgumentError作为无效日期。 :valid_until日期仍会针对to_date运行。

我猜这个有救援似乎是唯一的答案,只是想知道是否有更聪明的方法来尝试迎合nils和无效的日期错误,然后再将其设置为明年的默认值。

修改

您可以阅读 Try here

您可以阅读 to_date here

2 个答案:

答案 0 :(得分:2)

您滥用Object.try。如果对象上不存在方法,则此方法将无提示失败。在这种情况下,方法就在那里(因此被调用)并且该方法失败。

这并不是要替换try / rescue块。可能的实现如下。

def expiration_date(a_string)
  Date.parse(a_string)
rescue
  Date.today.next_year
end

valid_until = expiration_date(params[:valid_until])

答案 1 :(得分:1)

除非它有某种代码高尔夫,否则我不会尝试尽可能多地在一个衬里中挤出逻辑。此外,您可能希望让控制器尽可能精益。为什么不使用一些理智的OO直觉告诉你:"如果我不能弄清楚这里的逻辑,也许我应该把它提取到单独的方法或类#34;? F.i。

# app/services/expirer.rb
class AccountExpirer
  def self.expiration_date(user_input)
    return Date.today.next_year unless user_input.present?
    begin
      Date.parse(user_input)
    rescue ArgumentError
      Date.today.next_year
    end
  end
end

# some controller
valid_until = AccountExpirer.expiration_date(params[:valid_until])

但是如果你需要告诉用户他输入了无效数据,我就不会停在这里。您可以使用ActiveModel::Modelhttp://api.rubyonrails.org/classes/ActiveModel/Model.html)扩展您的课程,这样您就可以编写正确的验证,并在表单中使用它(就像AR模型一样)。