Подтвердить что ты не робот

Ошибка проверки правильности ошибок в Rails, но ошибок в модели ошибок ActiveRecord нет

У меня возникла проблема с ошибками проверки при сохранении модели с помощью save!. Ошибочные сообщения об ошибках модели ActiveRecord пустые, поэтому я не знаю, какие ошибки происходят при попытке проверки. Когда я пытаюсь error.full_messages или errors.each_full в соответствии с документацией, он должен отображать ошибки, которых у них нет.

Модель, которую я пытаюсь сохранить, - это модель ордеров (сайт электронной торговли с использованием Spree). Когда элемент в порядке удаляется, update_totals! получает вызов, который пересчитывает итоговые значения, а затем сохраняет!, который вызывает ошибку проверки ( эта ошибка происходит очень редко, но только когда я вошел в систему, и я не смог найти причину этого). Модель заказа имеет две проверки в своей модели:

  validates_numericality_of :item_total
  validates_numericality_of :total

я записал order.item_total.inspect, order.total.inspect и order.errors.full_messages.inspect и получил следующее:

Wed Jan 25 08:53:08 -0800 2012order item total: #<BigDecimal:15780c60,'0.279E2',8(16)>
Wed Jan 25 08:53:08 -0800 2012order total: #<BigDecimal:152bf410,'0.2448225E2',12(20)>
Wed Jan 25 08:53:08 -0800 2012: ERRORS SAVING ORDER: 
Wed Jan 25 08:53:08 -0800 2012[]

item_total и общая сумма сохраняются в базе данных mySQL как десятичная (8,2). Последняя строка - order.errors.full_messages.inspect, который является пустым массивом. Ошибка проверки выглядит следующим образом:

ActiveRecord::RecordInvalid (Validation failed: {{errors}}):
  vendor/extensions/mgx_core/app/models/order.rb:382:in `update_totals!'
  vendor/extensions/mgx_core/app/controllers/line_items_controller.rb:7:in `destroy'
  app/middleware/flash_session_cookie_middleware.rb:19:in `call'
  C:\Users\mgx\My Documents\Aptana Studio 3 Workspace\catalogue-spree\script\server:3
  c:/Ruby187/lib/ruby/gems/1.8/gems/ruby-debug-ide-0.4.16/lib/ruby-debug-ide.rb:112:in `debug_load'
  c:/Ruby187/lib/ruby/gems/1.8/gems/ruby-debug-ide-0.4.16/lib/ruby-debug-ide.rb:112:in `debug_program'
  c:/Ruby187/lib/ruby/gems/1.8/gems/ruby-debug-ide-0.4.16/bin/rdebug-ide:87
  c:/Ruby187/bin/rdebug-ide:19:in `load'
  c:/Ruby187/bin/rdebug-ide:19

Я думаю, мой вопрос двоякий:

1. Почему моя модель ошибок activerecord не говорит, что такое ошибка проверки?

2. Как исправить эту проблему? Является ли мой item_total и total действительным для сохранения как десятичного (8,2)?

Я использую рельсы 2.3.5 и веселье 0.10.2

4b9b3361

Ответ 1

Если у вас есть объявления before_validation и если они возвращают false, вы получите сообщение Validation failed (ActiveRecord::RecordInvalid) с пустым сообщением об ошибке (если нет других ошибок).

Обратите внимание, что before_validation обратные вызовы не должны возвращать false (nil в порядке), и это может произойти случайно, например, если вы назначаете false логическому атрибуту в последней строке внутри этого метода обратного вызова, Явно напишу return true в методах обратного вызова, чтобы сделать эту работу (или просто true в конце, если ваш обратный вызов является блоком (как отмечает Джесси Вольгамотт в комментариях)).

UPDATE. Это больше не будет проблемой при запуске Rails 5.0, так как return false больше не остановит цепочку обратного вызова (throw :abort теперь остановит цепочку обратного вызова).

UPDATE. Вы также можете получить ActiveRecord::RecordNotSaved: Failed to save the record, если обратный вызов возвращает false.

Ответ 2

Я думаю, что проблема кроется в коде контроллера. Переменная порядка устанавливается до того, как позиция уничтожена и не знает, что она была уничтожена впоследствии. Этот код действительно должен быть в модели:

# line_item.rb
after_destroy :update_totals!
delegate :update_totals, :to=> :order

И контроллер должен просто уничтожить позицию.

Ответ 3

Когда вы создаете другой регистр в методе before_validation, в случае его сбоя класс "папа" выдает ошибку, поэтому он не будет отображать ошибку, просто <ActiveRecord::RecordInvalid: Validation failed: > Я заметил, что когда я получил ошибку в моем "ребенке" 'записать с помощью byebug внутри до метода валидации

Ответ 4

Относительно 1. Почему моя модель ошибок activerecord не говорит о том, что такое ошибка проверки?, проверьте, установлен ли установленный gem i18n. Если вы это сделаете, попробуйте удалить или более раннюю версию gem i18n.

gem uninstall i18n

Ответ 5

Мне кажется, что вы используете Ruby 1.8.7. Вы пытались запустить приложение с помощью Ruby 1.9.3?