Rails获得validation失败错误,但ActiveRecord错误模型中没有错误
使用save!保存模型时遇到validation错误问题。 ActiveRecord错误模型错误消息是空白的,所以我不知道validation尝试发生了什么错误。 当我根据文档尝试errors.full_messages或errors.each_full时,它应该显示错误,而不是错误。
我试图保存的模型是Orders模型(使用Spree的电子商务网站)。 当订单中的项目被删除时,update_totals! 被调用,重新计算总数,然后保存! 被调用,它会触发validation错误( 这个错误很少发生,但只有当我登录时 ,我才能找到它的原因)。 订单模型在其模型中有两个validation:
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: # Wed Jan 25 08:53:08 -0800 2012order total: # Wed Jan 25 08:53:08 -0800 2012: ERRORS SAVING ORDER: Wed Jan 25 08:53:08 -0800 2012[]
item_total和total以十进制(8,2)的forms存储在mySQL数据库中。 最后一行是order.errors.full_messages.inspect,这是一个空数组。 validation错误如下所示:
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错误模型没有说出validation错误是什么?
2.我该如何解决这个问题? 我的item_total和total是否有效保存为十进制(8,2)?
我使用的是rails 2.3.5和spree 0.10.2
当你有before_validation
声明并且它们返回false
你将得到一个带有空错误消息的Validation failed (ActiveRecord::RecordInvalid)
消息(如果没有其他错误)。
请注意, before_validation
回调不能返回false
( nil
没问题),这可能是偶然发生的,例如,如果您在该回调方法的最后一行中为布尔属性赋值false
。 在你的回调方法中明确地写return true
以使其工作(或者如果你的回调是一个块 ,则在结尾处为true
(如评论中的Jesse Wolgamott所述))。
更新 :这将不再是启动Rails 5.0的问题,因为return false
将不再停止回调链( throw :abort
现在将暂停回调链)。
更新 :您可能还会收到ActiveRecord::RecordNotSaved: Failed to save the record
如果回调返回false
则ActiveRecord::RecordNotSaved: Failed to save the record
。
我认为问题在于控制器代码。 订单变量在订单项销毁之前设置,并且不知道它之后已被销毁。 这段代码应该在模型中:
# line_item.rb after_destroy :update_totals! delegate :update_totals, :to=> :order
控制器应该只是销毁订单项。
关于1.为什么我的activerecord错误模型没有说明validation错误是什么? ,看看你是否安装了gem i18n 。 如果您这样做,请尝试卸载或更早版本的gem i18n 。
gem uninstall i18n
它看起来像你使用Ruby 1.8.7。 您是否尝试过使用Ruby 1.9.3运行应用程序?