如何挽救模型交易并向用户显示错误?

NoDisplayName

因此,假设您有2个模型,人员和地址,并且每个人只有一个地址可以标记为“主要”。因此,如果我想更改一个人的主要地址,则需要使用一笔交易,将新地址标记为主要地址,而不标记旧地址。据我所知,在控制器中使用事务并不好,所以我在模型中有一种特殊的方法,那就是我所拥有的:

AddressesController < ApplicationController
 def update
  @new_address = Address.find(params[:id])
  @old_address = Address.find(params[:id2])
  @new_address.exchange_status_with(@old_address)       
 end
end

模型:

class Address < ActiveRecord::Base
  def exchange_status_with(address)
    ActiveRecord::Base.transaction do
     self.save!
     address.save!
    end     
  end
end

所以问题是,如果模型方法中的事务失败,我需要对其进行挽救并将错误通知用户,该怎么办?有没有办法使此模型方法像保存方法一样,根据事务是否成功返回true或false?

我可能可以将该事务放入控制器中,并在急救部件中呈现该错误消息,但是我想它是不正确的,或者我可以将该方法放入回调中,但是想象有某种原因我不能做到这一点,还有什么办法?

PS不注意查找具有参数id和id2的实例,只是随机的事情来表明我有2个实例

呼吸暂停
def exchange_status_with(address)
  ActiveRecord::Base.transaction do
   self.save!
   address.save!
  end
rescue ActiveRecord::RecordInvalid => exception
  # do something with exception here
end

仅供参考,一个异常看起来像:

#<ActiveRecord::RecordInvalid: Validation failed: Email can't be blank>

和:

exception.message
# => "Validation failed: Email can't be blank"

旁注,您可以更改self.save!save!


如果要保留活动模型错误,请使用备用解决方案:

class MyCustomErrorClass < StandardError; end

def exchange_status_with(address)
  ActiveRecord::Base.transaction do
   raise MyCustomErrorClass unless self.save
   raise MyCustomErrorClass unless address.save
  end
rescue MyCustomErrorClass
  # here you have to check self.errors OR address.errors
end

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何挽救模型交易并向用户显示错误?

来自分类Dev

CodeIgniter:如何计算、存储并向用户显示最终分数?

来自分类Dev

如何在出现错误并向用户发送消息时退出shell脚本?

来自分类Dev

如何使ID自动递增并向用户隐藏?

来自分类Dev

我如何使ID自动递增并向用户隐藏?

来自分类Dev

如何向用户显示内部服务器错误?

来自分类Dev

如何向用户显示类别

来自分类Dev

用户显示路线并向用户显示查询字符串栏

来自分类Dev

向用户显示全局/杂项错误消息

来自分类Dev

从 AJAX 向用户显示错误的问题

来自分类Dev

如何向用户显示正确的时区?

来自分类Dev

如何在Django Admin中向用户显示数据库错误

来自分类Dev

如何在页面的不同部分向用户显示错误消息?

来自分类Dev

Android Studio应用向用户显示错误消息

来自分类Dev

无法从ViewModel向用户显示协程错误消息

来自分类Dev

在Swift中向用户显示网络错误消息

来自分类Dev

Android:向用户显示错误的标准方法是什么?

来自分类Dev

向用户显示CRM 2016错误报告屏幕

来自分类Dev

如何在python-social-auth中向用户显示有意义的登录错误消息?

来自分类Dev

如何在python-social-auth中向用户显示有意义的登录错误消息?

来自分类Dev

如何在卸载前向用户显示提示框?

来自分类Dev

打印Jasper报告后如何向用户显示消息

来自分类Dev

如何在HTML页面上向用户显示输入?

来自分类Dev

如何使用django向用户显示两个视图

来自分类Dev

如何使用FormFlow向用户动态显示值列表

来自分类Dev

复制文本后,如何向用户显示“复制文本”?

来自分类Dev

Firefox扩展-如何从后台脚本向用户显示文本?

来自分类Dev

打开新标签页时如何向用户显示消息

来自分类Dev

如何使用FormFlow向用户动态显示值列表

Related 相关文章

  1. 1

    如何挽救模型交易并向用户显示错误?

  2. 2

    CodeIgniter:如何计算、存储并向用户显示最终分数?

  3. 3

    如何在出现错误并向用户发送消息时退出shell脚本?

  4. 4

    如何使ID自动递增并向用户隐藏?

  5. 5

    我如何使ID自动递增并向用户隐藏?

  6. 6

    如何向用户显示内部服务器错误?

  7. 7

    如何向用户显示类别

  8. 8

    用户显示路线并向用户显示查询字符串栏

  9. 9

    向用户显示全局/杂项错误消息

  10. 10

    从 AJAX 向用户显示错误的问题

  11. 11

    如何向用户显示正确的时区?

  12. 12

    如何在Django Admin中向用户显示数据库错误

  13. 13

    如何在页面的不同部分向用户显示错误消息?

  14. 14

    Android Studio应用向用户显示错误消息

  15. 15

    无法从ViewModel向用户显示协程错误消息

  16. 16

    在Swift中向用户显示网络错误消息

  17. 17

    Android:向用户显示错误的标准方法是什么?

  18. 18

    向用户显示CRM 2016错误报告屏幕

  19. 19

    如何在python-social-auth中向用户显示有意义的登录错误消息?

  20. 20

    如何在python-social-auth中向用户显示有意义的登录错误消息?

  21. 21

    如何在卸载前向用户显示提示框?

  22. 22

    打印Jasper报告后如何向用户显示消息

  23. 23

    如何在HTML页面上向用户显示输入?

  24. 24

    如何使用django向用户显示两个视图

  25. 25

    如何使用FormFlow向用户动态显示值列表

  26. 26

    复制文本后,如何向用户显示“复制文本”?

  27. 27

    Firefox扩展-如何从后台脚本向用户显示文本?

  28. 28

    打开新标签页时如何向用户显示消息

  29. 29

    如何使用FormFlow向用户动态显示值列表

热门标签

归档