Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
217 views
in Technique[技术] by (71.8m points)

ruby on rails - how to handle exceptions in JSON based RESTful code?

I have a "software as a service" app that uses JSON communicated via a RESTful API.

Simply stated: what are the best practices for capturing and reporting exceptions when using a RESTful API with JSON data interchange?

My first thought was to see what Rails does by generating a scaffold, but that's clearly not right. Here's an excerpt:

class MumblesController < ApplicationController

  # GET /mumbles/1
  # GET /mumbles/1.json
  def show
    @mumble = Mumble.find(params[:id])
    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @mumble }
    end
  end

end

In this case, if the JSON code sends a non-existent ID, e.g.

http://www.myhost.com/mumbles/99999.json

then Mumble.find() will raise ActiveRecord::RecordNotFound. ActionController will catch that and render an error page in HTML. But HTML is useless to the client that is expecting JSON.

I could work around that by wrapping the Mumble.find() in a begin ... rescue RuntimeError block and rendering a JSON status => :unprocessable_entity or something.

But then what if the client's app sends an invalid path, e.g.:

http://www.myhost.com/badtypo/1.json

Is a JSON based app supposed to catch that and return an error in JSON? If so, where do I capture that without digging deep into ActionDispatch?

So overall, do I punt and let ActionController generate HTML if there's an error? That doesn't feel right...

question from:https://stackoverflow.com/questions/11859437/how-to-handle-exceptions-in-json-based-restful-code

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

(I found the answer just before I hit [Post your question]. But this might help someone else as well...)

Use ActionController's rescue_from

The answer is to use ActionController's rescue_from, as described in this Guide and documented here. In particular, you can replace the default rendering of the default 404.html and 500.html files along these lines:

class ApplicationController < ActionController::Base
  rescue_from ActiveRecord::RecordNotFound, :with => :record_not_found

private
  def record_not_found(error)
    render :json => {:error => error.message}, :status => :not_found
  end 
end

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...