# Nested hash and nil question

**URL:** <https://www.ruby-forum.com/t/nested-hash-and-nil-question/167748>\
**Category:** Rails\
**Created:** [May 12, 2009, 7:54am UTC](https://www.ruby-forum.com/t/nested-hash-and-nil-question/167748 "2009-05-12T07:54:04Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![scottnj](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/b9e5f3/32.png) [@scottnj](https://www.ruby-forum.com/u/scottnj)\
**Post date:** [May 12, 2009, 7:54am UTC](https://www.ruby-forum.com/t/nested-hash-and-nil-question/167748/1 "2009-05-12T07:54:04Z")

</div>

i need to pull out some specific values from a nested hash, but nils  
are driving me crazy. in the following example, if address\_details,  
country, administrative\_area, locality OR postal\_code are nil i get  
“The error occurred while evaluating nil.[]”

zip = placemark[‘address\_details’][‘country’][‘administrative\_area’]  
[‘locality’][‘postal\_code’][‘postal\_code\_number’]

i tried

unless placemark[‘address\_details’][‘country’][‘administrative\_area’]  
[‘locality’][‘postal\_code’][‘postal\_code\_number’].nil?

but if anything above postal\_code\_number is nil i still get the error.  
i could check each level but that is really ugly.

is there a easy way to check if postal\_code\_number exists?

---

<div class="post-metadata">

**Author:** ![scottnj](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/b9e5f3/32.png) [@scottnj](https://www.ruby-forum.com/u/scottnj)\
**Post date:** [May 12, 2009, 9:02am UTC](https://www.ruby-forum.com/t/nested-hash-and-nil-question/167748/2 "2009-05-12T09:02:08Z")

</div>

What value should ‘zip’ contain if postal\_code\_number doesn’t exist (or  
any  
of the keys above it)?

If one of the keys in that long nasty chain are nil, you’re going to get  
an  
exception, but if you know an acceptable default value in case you can’t  
eval the whole expression, rescue the exception and return what you  
want.

If you want it to be an empty string, for instance, you could do:

zip =  
placemark[‘address\_details’][‘country’][‘administrative\_area’][‘locality’][‘postal\_code’][‘postal\_code\_number’]  
rescue ‘’

---

<div class="post-metadata">

**Author:** ![scottnj](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/b9e5f3/32.png) [@scottnj](https://www.ruby-forum.com/u/scottnj)\
**Post date:** [May 12, 2009, 4:25pm UTC](https://www.ruby-forum.com/t/nested-hash-and-nil-question/167748/3 "2009-05-12T16:25:35Z")

</div>

that will work perfect, thanks
