1,around_filter進(jìn)行action的自動(dòng)事務(wù)處理
在controller里面可以使用around_filter來進(jìn)行action的包裝,當(dāng)action中彈出異常的時(shí)候渲染一個(gè)特殊的出錯(cuò) 頁(yè)面。將action代碼包裝在ActiveRecord::Base.transaction函數(shù)的block中執(zhí)行,當(dāng)引發(fā)異常后截獲并重新拋出一個(gè) ActiveRecord::Rollback異常讓rails將數(shù)據(jù)回滾掉。ActiveRecord::Base.transaction對(duì) ActiveRecord::Rollback異常處理后不會(huì)再將該異常往外面拋。
在controller里面可以使用around_filter來進(jìn)行action的包裝,當(dāng)action中彈出異常的時(shí)候渲染一個(gè)特殊的出錯(cuò) 頁(yè)面。將action代碼包裝在ActiveRecord::Base.transaction函數(shù)的block中執(zhí)行,當(dāng)引發(fā)異常后截獲并重新拋出一個(gè) ActiveRecord::Rollback異常讓rails將數(shù)據(jù)回滾掉。ActiveRecord::Base.transaction對(duì) ActiveRecord::Rollback異常處理后不會(huì)再將該異常往外面拋。
around_filter :around_action_filter
protected
def transaction
ret = true
ActiveRecord::Base.transaction do
begin
yield if block_given?
rescue Exception => ex
set_notice(ex.message)
ret = ex.message
raise ActiveRecord::Rollback, ex.message
end
end
return ret
end
def around_action_filter
return yield if request.get?
redirect_to(:controller => "error_display", :action => "error_notice") if?
transaction { yield if block_given? } != true
end
這里的transaction函數(shù)可以用在action里面作為手動(dòng)事務(wù)處理的解決辦法。
http://www.cgpad.com/SPAN/articles_show/940
http://www.cgpad.com/SPAN/articles_show/940