after_commit для контроллера рельсов - PullRequest
1 голос
/ 02 апреля 2011

Я знаю, что для объектов ActiveRecord в Rails 3 предоставляется обратный вызов 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 Ответ

1 голос
/ 02 апреля 2011

Это должно сделать то, что вы пытаетесь сделать:

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

Я не проверял это, но это выглядит правильно.

...