2011-04-01 77 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