Вы можете вызвать first
для пустого массива, проблема в том, что он вернет nil
, и вы не можете сказать nil['src']
без грусти. Вы могли бы сделать это:
src = (element.ancestors('table').first || { })['src']
И если вы находитесь в Rails, вы можете использовать try
таким образом:
src = element.ancestors('table').first.try(:fetch, 'src')
Если вы много делаете такого рода вещи, то скрывайте уродство в методе:
def closest_attr_from(e, selector, attr)
a = e.closest(selector)
a ? a[attr] : nil
end
, а затем
src = closest_attr_from(element, 'table', 'src')
Вы также можете добавить его прямо в Nokogiri :: XML :: Node (но я бы не рекомендовал его):
class Nokogiri::XML::Node
def closest(selector)
ancestors(selector).first
end
def closest_attr(selector, attr)
a = closest(selector)
a ? a[attr] : nil
end
end