0

トランザクションと例外処理を使用して、一連のオブジェクトをオンザフライで作成しています。現在、ロールバックとすべてを期待どおりに処理していますが、私のレスキュー ブロックは、私が指示したアクションをレンダリングしようとしません。

これがトランザクションを処理する私のコードです

def post_validation
  ActiveRecord::Base.transaction do
    begin
      params[:users].each do |user|
          #process each user and save here   
      end 
      redirect_to root_path #success
      rescue ActiveRecord::RecordInvalid
      # something went wrong, roll back          
      raise ActiveRecord::Rollback 
      flash[:error] = "Please resolve any validation errors and re-submit"          
      render :action => "validation"          
    end
  end    
end

失敗時に予想されること:トランザクションをロールバックし、アクション「検証」をレンダリングします。

失敗時に何が起こっているか:トランザクションをロールバックし、存在しないビュー "post_validation" をレンダリングしようとします。

4

1 に答える 1

2

私が提供したコードにはいくつか問題があるようです。手始めに、ラインを気にする必要はありません。Railsraise ActiveRecord::Rollbackは、トランザクションブロック内で例外がスローされたときに、これをバックグラウンドで実行します。さらに、トランザクションブロックは開始ブロック内にある必要がありました。したがって、結果のコードは次のようになります。

def post_validation
  begin      
    ActiveRecord::Base.transaction do
      #process some new records here
      redirect_to root_path 
    end
    rescue ActiveRecord::RecordInvalid
    # handle the exception here; the entire transaction gets rolled-back        
    flash[:error] = "Please resolve any validation errors and re-submit"          
    render :action => "validation"          
  end
end
于 2012-10-17T17:22:56.790 に答える