Rails получает ошибку проверки, но нет ошибок в модели ошибок ActiveRecord - PullRequest
16 голосов
/ 25 января 2012

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

Модель, которую я пытаюсь сохранить, - это модель Orders.(сайт электронной коммерции, использующий 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 и 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 и итог действительным для сохранения в виде десятичной дроби (8,2)?

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

Ответы [ 4 ]

26 голосов
/ 11 апреля 2014

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

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

ОБНОВЛЕНИЕ : Это больше не будет проблемой, начиная с Rails 5.0, так как return false больше не будет останавливать цепочку обратных вызовов (throw :abort теперь будет останавливать цепочку обратных вызовов).

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

0 голосов
/ 11 июня 2014

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

0 голосов
/ 26 июня 2012

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

gem uninstall i18n
0 голосов
/ 15 мая 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...