我想尝试从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
答案 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::Model
(http://api.rubyonrails.org/classes/ActiveModel/Model.html)扩展您的课程,这样您就可以编写正确的验证,并在表单中使用它(就像AR模型一样)。