所以想象你有两个模型,人和地址,每个人只能有一个地址被标记为“主”.所以如果我想改变一个人的主要地址,我需要使用一个交易,将新的一个标记为主,并取消标记旧的.据我所知,在控制器中使用交易不是很好,所以我在模型中有一个特殊的方法,这就是我所得到的:
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