Ошибка проверки правильности ошибок в 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
Ответы
Ответ 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?