after_commit for rails controller

时间:2011-04-01 20:29:30

标签: ruby-on-rails-3 jruby jrubyonrails actioncontroller

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

答案 0 :(得分: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

我没有测试它,但看起来很正确。