It’s probably that you needed to go through by some hash or array like the below:
item = {
id: "0001",
type: "donut",
name: "Cake",
ppu: 0.55,
batters: {
batter: [
{id: "1001", type: "Regular"},
{id: "1002", type: "Chocolate"},
{id: "1003", type: "Blueberry"},
{id: "1004", type: "Devil's Food"}
]
},
topping: [
{id: "5001", type: "None"},
{id: "5002", type: "Glazed"},
{id: "5005", type: "Sugar"},
{id: "5007", type: "Powdered Sugar"},
{id: "5006", type: "Chocolate with Sprinkles"},
{id: "5003", type: "Chocolate"},
{id: "5004", type: "Maple"}
]
}
Let’s suppose you wanna get “Chocolate” value. At the first moment, you would think to go through like this:
> item[:batters][:batter][1][:type]
# => Chocolate
And if batter
does not exist? Or the array index does not exist? It would throw an exception doing your code breaks.
> item[:batters][:batter][10][:type]
# => NoMethodError (undefined method `[]' for nil:NilClass)
Hash#dig
A better approach could be to use dig
method:
> item.dig(:batters, :batter, 1, :type)
# => "Chocolate"
Dig does not throw exceptions, it just returns nil
when a key is not found.
> item.dig(:batters, :batter, 300, :type)
# => nil
This method is implemented by others classes like Array
, Struct
, OpenStruct
, CSV::Table
and CSV::row
.