Rails获取验证失败错误,但ActiveRecord错误模型中没有错误

时间:2012-01-25 17:21:53

标签: ruby-on-rails activerecord

使用save!保存模型时遇到验证错误问题。 ActiveRecord错误模型错误消息是空白的,所以我不知道在验证尝试中发生了什么错误。当我根据documentation尝试errors.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以十进制(8,2)的形式存储在mySQL数据库中。最后一行是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)?

我使用的是rails 2.3.5和spree 0.10.2

6 个答案:

答案 0 :(得分:26)

如果您有before_validation声明并且他们返回false,那么您将收到一条带有空错误消息的Validation failed (ActiveRecord::RecordInvalid)消息(如果没有其他错误)。< / p>

请注意,before_validation回调不得返回falsenil可以),这可能会偶然发生,例如,如果您要将false分配给布尔属性在该回调方法内的最后一行。在回调方法中明确写return true以使其有效(如果您的回调是,则最后只需true(如前所述) Jesse Wolgamott在评论中))。

UPDATE :这将不再是启动Rails 5.0的问题,因为return false将不再停止回调链(throw :abort现在将暂停回调链)。

更新:如果回调返回ActiveRecord::RecordNotSaved: Failed to save the record,您可能还会收到false

答案 1 :(得分:0)

我认为问题在于控制器代码。订单变量在订单项销毁之前设置,并且不知道它之后已被销毁。这段代码应该在模型中:

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

控制器应该只是销毁订单项。

答案 2 :(得分:0)

关于 1。为什么我的activerecord错误模型没有说出验证错误是什么?,看看你是否安装了gem i18n 。如果您这样做,请尝试卸载或更早版本的gem i18n

gem uninstall i18n

答案 3 :(得分:0)

在我看来,您使用的是Ruby 1.8.7。您是否尝试过使用Ruby 1.9.3运行应用程序?

答案 4 :(得分:0)

在before_validation方法中创建其他寄存器时,如果失败,则错误将由“父亲”类抛出,因此不会显示错误,只是<ActiveRecord::RecordInvalid: Validation failed: >我注意到当我得到一个验证方法前使用byebug在我的“孩子”记录中出现错误

答案 5 :(得分:0)

在此处进行回复,因为我们花了一些时间才能找到答案。我们正在升级到Rails 5.2,突然开始遇到此异常。

这是由于我们在模型上覆盖了destroyed?(我们是软删除项目)。