Possible Duplicate:
Ruby: Nils in an IF statement
Is there a clean way to avoid calling a method on nil in a nested params hash?
Let’s say I try to access a hash like this:
my_hash['key1']['key2']['key3']
This is nice if key1, key2 and key3 exist in the hash(es), but what if, for example key1 doesn’t exist?
Then I would get NoMethodError: undefined method [] for nil:NilClass. And nobody likes that.
So far I deal with this doing a conditional like:
if my_hash['key1'] && my_hash['key1']['key2'] …
Is this appropriate, is there any other Rubiest way of doing so?
There are many approaches to this.
If you use Ruby 2.3 or above, you can use dig
Plenty of folks stick to plain ruby and chain the
&&guard tests.You could use stdlib Hash#fetch too:
Some like chaining ActiveSupport’s #try method.
Others use andand
Some people think egocentric nils are a good idea (though someone might hunt you down and torture you if they found you do this).
You could use Enumerable#reduce (or alias inject).
Or perhaps extend Hash or just your target hash object with a nested lookup method
Oh, and how could we forget the maybe monad?