2012-01-16 4 views
2

私はRailsでAPIを作成していますが、エラーメッセージが表示されたJSONを渡すことで何か不具合が発生したことをユーザーに警告したいという状況に遭遇しました。しかし、Airbrake(以前のHoptoad)もエラーをキャッチして、私たちに通知して問題をもう少し調べることができるように、例外を再作成したいと思います。Railsコントローラでの例外のレンダリングと再生成

私は現在、そうのようなエラーをキャッチしています:

begin 
    if @myobject.update_attributes(:foo => "bar") 
    render :json => @myobject, :status => :ok 
    else 
    render :json => @myobject.errors, :status => :unprocessable_entity 
    end 
rescue Exception => e 
    render :json => { :errors => { :message => "Uh oh! Something went wrong." } } 
    raise e 
end 

問題はraise eをレンダリングし、それを一般的な500エラーを送信しますから、それを停止して以来、私のクライアントは、JSONメッセージを取得することはありませんということです。

これはどのように修正する必要がありますか?

[マイソリューション]

以下ジョーダンによって示唆されるように、私は単に私のコードでは、私は例外をキャッチし、いつでもnotify_airbrake(ex)を呼び出します。

class ApplicationController < ActionController::Base 
    ... 

    def notify_exception_service(ex) 
    notify_airbrake(ex) 
    end 

    ... 
end 

だから私はちょうどnotify_exception_service(ex)を呼び出す代わりにnotify_airbrake(ex)で、私は簡単に将来的に何か他のものにエアブレーキから変更することができるようにしかし、私は私のApplicationControllerに以下を追加することで、わずかにそれを抽象化。

答えて

2

エアブレーキ宝石documentationから:

rescue => ex 
    notify_airbrake(ex) 

    flash[:failure] = 'Encryptions could not be rerouted, try again.' 
end 

#notify_airbrakeコール:

あなたは、コントローラから自分を救ってきた任意のものを記録したい場合は、このような何かを行うことができます後で分析するためにAirbrakeに通知します。コントローラではnotify_airbrakeメソッドを使用しますが、コード内の他の場所ではAirbrake.notifyを使用します。

Airbrakeでログに記録するために例外を再発行する必要はありません。

+1

ありがとうジョーダン。私はもっ​​と良い解決策を見つけることを望んでいましたが、それが私がやり遂げたことです。しかし、私はAirbrakeから必要に応じて何かに簡単に変更できるように、少し抽象化しました。 –

2

私がチャットで言ったように、私はあなたがレールをどのようにレンダリングするかを考えることはできないと思います。 レンダリングを呼び出すと、@ _something_render_variableが設定されますが、ページは直接レンダリングされませんが、さらに呼び出しがあります。例外を発生させると、このフローがブロックされ、実際にはWebページのレンダリングが中断されます。

この動作を変更するのは本当に難しいです。レンダリングメソッドのエイリアスを設定して作業する必要があります。同様の問題がありました。

+0

本当に質問に答えるだけでなく、ギャップを解消するソリューションとしてサードパーティのアプリを紹介してくれてありがとう – user566245

関連する問題