Вы звоните referenced_by_line_item, прежде чем что-то делать.Если есть позиции, возвращается false, поэтому вы не можете удалять позиции.Я не думаю, что такое поведение, которое вы хотите.Если вы измените его на:
if !@product.referenced_by_line_item
@product.line_items.remove_all
end
delete :destroy, :id => @product.to_param
, то, вероятно, сработает @product.destroy
.
Хотя, вероятно, имеет смысл изменить логику в referenced_by_line_item
.Было бы более разумно сказать, что если с этим продуктом связаны позиции, то на этот товар ссылается позиция.Я думаю, что ваша логика обратная.
Кроме того, булевы методы должны заканчиваться на '?'
Я вижу здесь сложность.Вы хотите, чтобы он возвращал false, когда есть позиции, чтобы он не сохранялся, но возвращаемое значение не соответствует имени метода.Может быть, что-то вроде этого было бы лучше:
def no_line_items_present?
if line_items.count > 0
# add errors
return false
else
return true
end
end
Тогда вы можете сказать:
@product.line_items.remove_all unless @product.no_line_items_present?
delete :destroy, :id => @product.to_param
Хотя я не вижу смысла проверять позиции, прежде чем принять решение об их удалении, кромедля небольшого увеличения производительности.