through references rails query inner includes has_one has_and_belongs_to_many ruby-on-rails activerecord

ruby on rails - references - Rails obtuvo error de validación, pero no hay errores en el modelo de error de ActiveRecord



rails references (4)

Con respecto a 1. ¿Por qué mi modelo de errores de registro de activador no dice cuál es el error de validación? , mira si tienes la gema i18n instalada. Si lo hace, intente desinstalar o una versión anterior de la gema i18n .

gem uninstall i18n

Estoy teniendo un problema con los errores de validación al guardar un modelo utilizando guardar !. Los mensajes de error del modelo de error de ActiveRecord están en blanco, así que no sé qué errores están ocurriendo en un intento de validación. Cuando intento errors.full_messages o errors.each_full de acuerdo con la documentation , debería mostrar los errores, lo cual no es así.

El modelo que estoy intentando guardar es el modelo de pedidos (sitio de comercio electrónico que usa Spree). Cuando se borra un artículo en el pedido, update_totals! se llama y recalcula los totales, y luego guarda! se llama, lo que desencadena el error de validación ( este error ocurre muy raramente, pero solo cuando estoy conectado , y no he podido encontrar la causa). El modelo de orden tiene dos validaciones en su modelo:

validates_numericality_of :item_total validates_numericality_of :total

Grabé order.item_total.inspect, order.total.inspect y order.errors.full_messages.inspect y obtuve esto:

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 y total se almacenan en la base de datos mySQL como decimal (8,2). La última línea es order.errors.full_messages.inspect, que es una matriz vacía. El error de validación se ve así:

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

Supongo que mi pregunta es doble:

1. ¿Por qué mi modelo de errores de registro de actividad no dice cuál es el error de validación?

2. ¿Cómo soluciono este problema? ¿Es mi item_total y el total válido para guardar como decimal (8,2)?

Estoy usando rieles 2.3.5 y juerga 0.10.2


Creo que el problema está en el código del controlador. La variable de orden se establece antes de que se destruya la línea de pedido, y no es consciente de que se haya destruido posteriormente. Este código debería estar realmente en el modelo:

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

Y el controlador simplemente debe destruir la línea de pedido.


Cuando tiene declaraciones de before_validation y si devuelven false Validation failed (ActiveRecord::RecordInvalid) mensaje de Validation failed (ActiveRecord::RecordInvalid) con un mensaje de error vacío (si no hay otros errores).

Tenga en cuenta que before_validation devoluciones de llamada before_validation no deben devolver false (nada está bien) y esto puede suceder por accidente, por ejemplo, si está asignando false a un atributo booleano en la última línea dentro de ese método de devolución de llamada. Escriba explícitamente return true en sus métodos de devolución de llamada para hacer que esto funcione (o simplemente true al final si su devolución de llamada es un bloqueo (como lo señaló Jesse Wolgamott en los comentarios)).

ACTUALIZACIÓN : Esto ya no será un problema al iniciar Rails 5.0, ya que return false ya no detendrá la cadena de devolución de llamada ( throw :abort ahora detendrá la cadena de devolución de llamada).

ACTUALIZACIÓN : También puede recibir ActiveRecord::RecordNotSaved: Failed to save the record si una devolución de llamada devuelve false .


Me parece que estás usando Ruby 1.8.7. ¿Has intentado ejecutar tu aplicación usando Ruby 1.9.3?