2017-10-11 8 views
0

を扱う:のActiveRecord ::応答のようなRecordNotFoundが、私はこのようなコード例を持って

def update 
    if @transaction.update(transaction_params) 
    render :show, status: :ok 
    else 
    render json: @transaction.errors, status: :unprocessable_entity 
    end 
end 

そして、私は存在しないレコードを更新しようとするとは、言い換えればコントローラにはActiveRecord :: RecordNotFoundを発生させます。

enter image description here

:私はこの例外は、独自の応答ハンドラまたは何かを持っているとして、救出し、何をレンダリングする必要はありません、これは郵便配達のスクリーンショット、上記の方法に無効なIDを提供したときに、私は反応して得るものですここ

は、テキストバージョンである:私は私自身のコントローラクラスを追加し、私がモデルからそれを上げるとき、私は特にコントローラで、それを救出しない場合

{ 
    "status": 404, 
    "error": "Not Found", 
    "exception": "#<ActiveRecord::RecordNotFound: Couldn't find Transaction with 'id'=88 [WHERE \"transactions\".\"active\" = ?]>", 
    "traces": { 
     "Application Trace": [ 
      { 
       "id": 6, 
       "trace": "app/controllers/api/v1/transactions_controller.rb:42:in `set_transaction'" 
      } 
     ], 
     "Framework Trace": [ 
      { 
       "id": 0, 
       "trace": "vendor/bundle/gems/activerecord-5.1.4/lib/active_record/relation/finder_methods.rb:343:in `raise_record_not_found_exception!'" 
      }, 
      { 

はしかし、私は500を取得します。

これはActiveRecord :: RecordNotFoundの仕組みですか?カスタムエラーにレスポンスハンドラを追加するにはどうすればよいですか?

答えて

0

私はあなたのApplicationControllerにでrescue_fromを使用することをお勧め:

class ApplicationController 
    rescue_from MyOwnException do |exception| 
    render 'my_error_view' 
    end 
end 

別の方法としては、config/application.rbでこのようにそれを設定し、exception_appを使用することができます。

config.exceptions_app = routes 

あなたは、その後のレンダリングを制御することができます経路によるエラー:

match '/404', to: 'exceptions#handle_404' 

このブログ記事の詳細は、Handling errors in Ruby on Rails

です
関連する問題