自定义Ruby方法不适用于nil对象

时间:2013-12-09 17:22:01

标签: ruby-on-rails ruby

我有以下客户Ruby方法:

class Fixnum
  def utc_datetime
    Time.at(self).utc.to_datetime
  end
end

我会像这样使用它:

time = 1386592732
time.utc_datetime

问题是timenil时。当它是nil时,它会抛出这个:

NoMethodError: undefined method `utc_datetime' for nil:NilClass

如何避免NoMethodError

另一个使得调用if语句更难以检查的用例有时会用于这样的事情:

Article.create(account: 1, published_at: time.utc_datetime, title: 'Example')

5 个答案:

答案 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