我有以下客户Ruby方法:
class Fixnum
def utc_datetime
Time.at(self).utc.to_datetime
end
end
我会像这样使用它:
time = 1386592732
time.utc_datetime
问题是time
为nil
时。当它是nil
时,它会抛出这个:
NoMethodError: undefined method `utc_datetime' for nil:NilClass
如何避免NoMethodError
?
另一个使得调用if
语句更难以检查的用例有时会用于这样的事情:
Article.create(account: 1, published_at: time.utc_datetime, title: 'Example')
答案 0 :(得分:4)
time.try(:utc_datetime)
会尝试为您调用该方法,并返回调用的返回值,如果不存在则返回nil
。
答案 1 :(得分:1)
这个怎么样?只需检查变量是否有效。
time.utc_datetime if time
答案 2 :(得分:1)
正确的解决方案是测试变量nullity:
if !time.nil?
time.utc_datetime
# ...
end
但你也可以使用开始/救援区......
begin
time.utc_datetime
# ...
rescue NoMethodError => err
# recovery code
end
另一种方法是utc_datetime
不是Fixnum
的方法,因此它会执行检查本身,例如:
def utc_datetime(time)
if time.nil?
nil # or whatever you need
else
Time.at(time).utc.to_datetime
end
end
最糟糕但最有趣的解决方案是给出一个utc_datetime
方法:
def nil.utc_datetime
# whatever
end
更好的解决方案是确保time
变量始终包含Fixnum
个实例
给它一个默认值,并确保在其生命周期内只为它分配Fixnums。
答案 3 :(得分:1)
nil.to_i
返回零
在调用utc_datetime
之前将时间转换为整数time.to_i.utc_datetime
答案 4 :(得分:0)
首先,作为vgoff和Dave的评论,你需要做的是不要在nil对象上调用它。这种方法没有错。
其次,在Rails的上下文中,这样做是错误的。您无需手动设置创建时间。字段created_at
将自动创建,并在UTC时间创建。
你只需要做什么
article.created_at.to_datetime