Кажется, у вас здесь много проблем.
Прежде всего, вы делаете слишком много работы. Это все, что вам действительно нужно.
before_save :check_product_stock
def check_product_stock
if product.stocknumber == 0
flash[:notice] = "Producto con pedos de stock"
end
end
Во-вторых, флэш-хэш недоступен в моделях. Вы можете использовать объект ошибки ActiveRecord, чтобы сделать ошибки доступными для контроллера и представлений, заменив
flash[:notice] =
с errors.add_to_base
Я использовал errors.add_to_base, потому что ошибка не является частью этой модели, но все еще блокирует сохранение.
В-третьих, кажется, что в какой-то момент вы уменьшаете количество продукта. Вероятно, как before_validation, поэтому весьма вероятно, что product.stocknumber будет меньше 0 во время проверки, если product.stocknumber был 0 перед вызовом сохранения.
Итак, давайте изменим условие if, чтобы отразить это.
unless product.stocknumber > 0
Наконец, вы используете обратный вызов before_save, поэтому простое добавление ошибки не отменит транзакцию. Вы должны вернуть false для обратного вызова save / create / update / valdiaiton до / после, чтобы отменить транзакцию.
Соединение всего этого дает вам
before_save :check_product_stock
def check_product_stock
unless product.stocknumber > 0
errors.add_to_base "Producto con pedos de stock"
return false
end
true # guards against returning nil which is interpreted as false.
end
Что касается отображения этих ошибок, вы можете использовать симпатичный помощник error_messages_for для объекта в представлении. Или скопируйте ошибки во флэш-хэш в контроллере.
По виду:
<%= error_mesages_for :order %>
Или в контроллере в блоке else if @order.save
:
flash[:errors] = @order.errors.full_messages.join "<br />"
Я предпочитаю ошибки, а не уведомления, когда речь идет о передаче ошибок во флэш-хэш, потому что это облегчает их различение с помощью CSS, если какое-либо действие приводит к появлению как уведомлений, так и ошибок. Также более СУХОЙ всегда отображать flash [: errors] с классом, который дает красный текст, напишите логику в своем представлении, чтобы определить, является ли содержимое flash [: уведомлением] ошибкой или уведомлением.