所以想象你有两个模型,人和地址,每个人只能有一个地址被标记为“主”.所以如果我想改变一个人的主要地址,我需要使用一个交易,将新的一个标记为主,并取消标记旧的.据我所知,在控制器中使用交易不是很好,所以我在模型中有一个特殊的方法,这就是我所得到的:
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,这取决于事务是否成功,如save方法?
我可能会将该事务放在控制器中,并在救援部分中显示错误消息,但是我猜测它不正确,或者我可以将该方法放在回调中,但是想象一下,为什么我不能这样做,什么是替代?
解决方法
def exchange_status_with(address) ActiveRecord::Base.transaction do self.save! address.save! end rescue ActiveRecord::RecordInvalid => exception # do something with exception here end
FYI,一个例外情况如下:
#<ActiveRecord::RecordInvalid: Validation Failed: Email can't be blank>
和:
exception.message # => "Validation Failed: Email can't be blank"
旁注,你可以改变自我!保存!
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
原文地址:https://www.jb51.cc/ruby/271977.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。