2011-04-01 88 views
1

我知道一個after_commit回調被提供給Rails 3中的ActiveRecord對象。不過,我想在Rails控制器中訪問這個功能。after_commit for rails控制器

的目的是做這樣的事情在控制器:

rescue_from AccountError, :with => :render_internal_error 

after_commit :render_created, :on => :create 

def create 
    Account.transaction do 
    modify_underlying_system 
    @account.save! 
    end 
end 

protected 
def render_created 
    render :status => 201, :json => {...} 
end 

def render_internal_error 
    render :status => 500, :json => {...} 
end 

有沒有一些方法,我可以實現這一目標?我不想使用ActiveRecord after_commit回調,因爲它意味着通過讓模型進行渲染來打破模型和控制器之間的分離,這是它不應該做的事情。

回答

1

這應該做你想做什麼:

def create 
    begin 
    Account.transaction do 
     modify_underlying_system 
     @acount.save! 
    end 
    render :status => 201, :json => {...} 
    rescue ActiveRecord::RecordInvalid 
    render :status => 500, :json => {...} 
    end 
end 

我沒有測試,但是這看起來是正確的。

+0

這是我的第一個方法。它對我來說效果不好,因爲我有許多可能來自modify_underlying_system調用的異常。爲此,我使用rescue_from,但我認爲在事務成功時必須有更簡潔的方式發送成功響應。有什麼方法可以確定交易是否成功? – rmk 2011-04-01 20:44:16

+0

我不這麼認爲,你唯一能做的就是檢查事務中拋出的異常。在您的modify_underlying_system調用中調用的任何保存應該也會導致RecordInvalid異常,所以它應該可以工作。你可以看看ActiveRecord :: Rollback異常,但我不確定這是否真的流入開始/救援部分。 – ctide 2011-04-01 20:53:10

+0

看起來像你給了我*僅*回答:) – rmk 2011-04-11 17:54:10