1

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のは、モデルにレンダリングを実行させることでモデルとコントローラーの分離を破ることを意味するためです。これは、実行すべきではないことです。

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 に答える