Я собираюсь догадаться, что это не проблема области видимости, как показывает следующий тест irb:
irb(main):001:0> begin
irb(main):002:1* product = 'abc'
irb(main):003:1> rescue Exception => ex
irb(main):004:1> nil
irb(main):005:1> else
irb(main):006:1* puts product.inspect
irb(main):007:1> end
Лучший способ выяснить это, ИМО, - это выяснить, что находится в продукте сразу после поиска, используя LOGGER.debug "product now contains #{product.inspect}"
.
Ваш обратный след также будет информационным. На данный момент сложно сказать, на что жалуется переводчик. Возможно, этот продукт равен нулю, но с такой же легкостью это может быть @cart или что-то, на что вы ссылаетесь.