1

指定されたオブジェクトが nil であり、その属性が nil または空であるかどうかを確認する「エレガントな」方法を探しています。現時点では、私はこのチェックを持っています

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?

これを行うためのよりエレガントな方法があり、トリプル OR チェックを回避できますか? begin/catch誰かがそれを提案した場合に備えて、ラップインはエレガントな方法ではありません。

4

3 に答える 3

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

代替案

Object#と、activesupport全体に沿ってドラッグしたくない場合や、すでに記述されているコードを記述したくない場合は、ここにあります。

data = response.andand['data']
raise Exception, "Response is not valid" if data.nil? || data.empty?
于 2012-11-13T14:08:00.387 に答える
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?

明らかに、この最後の行はあなたのものと大差ありません。

于 2012-11-13T14:14:29.660 に答える
2
unless response && response['data'] && !response['data'].empty?
于 2012-11-13T14:07:16.527 に答える