加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 获得验证的Rails失败,但ActiveRecord错误模型

发布时间:2020-12-16 20:24:01 所属栏目:百科 来源:网络整理
导读:当使用save!保存模型时,我遇到了验证错误的问题. ActiveRecord错误模型错误消息是空白的,所以我不知道验证尝试发生了什么错误.当我根据 documentation尝试errors.full_messages或errors.each_full时,应该显示错误,而不是. 我想要保存的模型是订单模型(使用S
当使用save!保存模型时,我遇到了验证错误的问题. ActiveRecord错误模型错误消息是空白的,所以我不知道验证尝试发生了什么错误.当我根据 documentation尝试errors.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和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:UsersmgxMy DocumentsAptana Studio 3 Workspacecatalogue-spreescriptserver: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

我想我的问题有两个方面:

为什么我的activerecord错误模型不是说验证错误是什么?

2.如何解决这个问题?我的item_total和total有效保存为十进制(8,2)吗?

我使用的是rails 2.3.5和spree 0.10.2

解决方法

当你有before_validation声明,如果它们返回false,那么你将得到一个验证失败(ActiveRecord :: RecordInvalid)消息与一个空的错误消息(如果没有其他错误).

请注意,before_validation回调函数不能返回false(否则为null),这可能会意外发生,例如,如果将false返回给该回调方法中最后一行的布尔属性.明确地在你的回调方法中返回true以使其工作(或者如果你的回调是一个块(如评论中的Jesse Wolgamott所指出的那样),那么结果就是这样).

更新:这将不再是Rails 5.0启动的问题,因为返回false将不再停止回调链(throw:abort将暂停回调链).

更新:您还可能会收到ActiveRecord :: RecordNotSaved:如果回调返回false,则无法保存记录.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读