1

我知道after_commitRails 3 中为 ActiveRecord 对象提供了回调。但是,我想在 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

有什么办法可以做到这一点吗?我不想使用 ActiveRecordafter_commit回调,因为这意味着通过让模型进行渲染来打破模型和控制器之间的分离,这是它不应该做的事情。

4

1 回答 1

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

我没有测试它,但这看起来是正确的。

于 2011-04-01T20:38:34.907 回答