Вы на Ruby 2.3+? Попробуйте Hash#dig
:
object_to_search_containing_property.dig(*property_selector) # => "fff"
object_to_search_not_containing_property.dig(*property_selector) # => nil
Единственная ошибка в том, что элементы вашего массива селекторов свойств являются строками, но вы создаете вложенный объект с помощью символьных ключей. Вместо этого определите свой массив селектора свойств, как показано выше, для работы приведенного выше кода:
property_selector = [:component_styles, :styles, :background, :color]
Или, если вы не можете контролировать, как определяется этот массив, вы можете преобразовать его на лету:
object.dig(*property_selector.map(&:to_sym))
Вот портативный метод:
def dig(object, *keys)
keys.each do |key|
break unless object.respond_to?(:[])
object = object[key]
end
object
end
dig(object_to_search_containing_property, *property_selector) # => "fff"
dig(object_to_search_not_containing_property, *property_selector) # => nil
То же предостережение о массиве селектора свойств применимо и здесь.