Module: Hashie::Extensions::DeepFetch

Defined in:
lib/hashie/extensions/deep_fetch.rb

Overview

Searches a deeply nested datastructure for a key path, and returns the associated value.

options = { user: { location: { address: '123 Street' } } } options.deep_fetch :user, :location, :address #=> '123 Street'

If a block is provided its value will be returned if the key does not exist.

options.deep_fetch(:user, :non_existent_key) { 'a value' } #=> 'a value'

This is particularly useful for fetching values from deeply nested api responses or params hashes.

Defined Under Namespace

Classes: UndefinedPathError

Instance Method Summary collapse

Instance Method Details

#deep_fetch(*args, &block) ⇒ Object


17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/hashie/extensions/deep_fetch.rb', line 17

def deep_fetch(*args, &block)
  args.reduce(self) do |obj, arg|
    begin
      arg = Integer(arg) if obj.is_a? Array
      obj.fetch(arg)
    rescue ArgumentError, IndexError, NoMethodError => e
      break yield(arg) if block
      raise UndefinedPathError,
            "Could not fetch path (#{args.join(' > ')}) at #{arg}", e.backtrace
    end
  end
end