检查Object是否为nil且required属性为nil或为空

时间:2012-11-13 14:05:23

标签: ruby

我正在寻找“优雅”的方法来检查给定的对象是否为零,并且它的属性为零或空。目前我有这个检查

response = foo.call() # some service call, no http code given :)
raise StandardError, "Response is not valid" if response.nil? || response['data'].nil? || reponse['data'].emtpy?

有没有更优雅的方法来做到这一点,并避免三重或检查?如果有人建议的那样,换入begin/catch并不是一种优雅的方式。

3 个答案:

答案 0 :(得分:4)

这个怎么样?

data = response.try(:[], 'data')
raise Exception, "Response is not valid" if data.nil? || data.empty?

正如@ksol在评论中正确提到的那样,try助手来自ActiveSupport。但重新实施并不困难。

class Object
  def try method, *args
    if respond_to? method
      send method, *args
    else
      nil
    end
  end
end

class Foo
  def hello name
    "hello #{name}"
  end
end

f = Foo.new
f.try(:bar) # => nil
f.try(:hello, 'world') # => "hello world"
nil.try(:wat) # => nil

替代

如果您不想拖动整个activesupport并且不想编写已编写的代码,那么这里是Object#andand

data = response.andand['data']
raise Exception, "Response is not valid" if data.nil? || data.empty?

答案 1 :(得分:3)

如果这是在Rails中,你可以这样做:

raise "Response is not valid" unless response && response['data'].present?

在Rails之外,我不确定你能比原来的线做得更好。另一种变化可能是:

raise "Response is not valid" unless response && response['data'] && !response['data'].empty?

显然,最后一行与你的差别不大。

答案 2 :(得分:2)

unless response && response['data'] && !response['data'].empty?