Rails API的错误处理有什么好的做法

时间:2014-11-04 02:37:11

标签: api ruby-on-rails-4

我在这个使用Ruby on Rails作为后端API的网站上工作,为此目的,后端错误处理的好方法是什么? 例如,如果未找到响应',如何能够稳健地返回指示此类消息的json数据?

编辑:

添加示例和更多背景信息以澄清

例如,在后端,如果我有

def top_photos
  user = User.find params[:user_id]
  photos = user.photos.order(created_at: :desc)
                             .limit(10)
  render json: user, status: 200
end

如果流程中存在任何错误,则无法找到具有给定user_id的用户, 将json格式数据返回到前端是一个很好的做法,以便在前端处理错误?

更多背景知识:网站中已经存在50多个控制器,我可以做些什么来使变化最小化并具有适应性?

1 个答案:

答案 0 :(得分:9)

假设您的代码如下,则可以在每个

中呈现状态
user = {
  name: "Tang",
  id: 40
}
render :json => user.to_json, :status => :ok

热门状态代码,请查看HTTP Status Codes and RESTful API crafting

200 :ok
201 :created
202 :accepted
400 :bad_request
401 :unauthorized
403 :forbidden
500 :internal_server_error

用于处理常规错误

如果你的api有自定义路线,你可以把它放在你的" ApplicationController" (或在命名空间的主控制器中,通常是ApiController):

 # CUSTOM EXCEPTION HANDLING
  rescue_from StandardError do |e|
    error(e)
  end

  def routing_error
    raise ActionController::RoutingError.new(params[:path])
  end

  protected

  def error(e)
    #render :template => "#{Rails::root}/public/404.html"
    if env["ORIGINAL_FULLPATH"] =~ /^\/api/
    error_info = {
      :error => "internal-server-error",
      :exception => "#{e.class.name} : #{e.message}",
    }
    error_info[:trace] = e.backtrace[0,10] if Rails.env.development?
    render :json => error_info.to_json, :status => 500
    else
      #render :text => "500 Internal Server Error", :status => 500 # You can render your own template here
      raise e
    end
  end