1

Rails を JSON のみの API サーバーとして使用していますが、コントローラーに例外が発生した場合、たとえば ID が 1 のレコードが存在しないときに削除しようとすると、Rails は応答する JSON で応答しません。 HTML では、開発中の場合はトレース、または運用中の一般的な「問題が発生しました」ページのいずれかです。

現在、すべてをレスキューでラップし、JSON レスポンスを手動で吐き出しています...

class AmazonAccountsController < ApplicationController

  respond_to :json, :xml

  def destroy
    # Handle bad API calls.
    begin
      @account = AmazonAccount.find(params[:id])
      @account.destroy
      # unrelated code...
    rescue
      render :json => {:errors => {:bad => "ID doesn't exist."}}.to_json
    end
  end

end

しかし、これはこれを処理する理想的な方法とは思えません。

これは Rails 3 にあります。

4

1 に答える 1

1

あなたが探しているrescue_from

エラーをキャッチするときにもう少し手の込んだことをしたい場合は、を使用できますrescue_from。これは、コントローラー全体とそのサブクラス内の特定のタイプ(または複数のタイプ)の例外を処理します。

ディレクティブによってキャッチされる例外が発生するとrescue_from、例外オブジェクトがハンドラーに渡されます。ハンドラーはProc、オプションに渡されるメソッドまたはオブジェクトにすることが:withできます。明示的なオブジェクトの代わりにブロックを直接使用することもできProcます。

したがって、次のようなことができます。

class ApplicationController < ActionController::Base
    rescue_from your_list_of_exceptions..., :with => :some_exception_handler
private
    def some_exception_handler
        render :json => { :error => 'some error message of some sort' }, :status => :unprocessable_entity # or whatever status makes sense.
    end
end

APIドキュメントrescue_fromも一見の価値があります。

于 2012-07-15T05:09:14.637 に答える