Rails API错误处理的最佳实践是什么?

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个回答

9
假设以下是您的代码,每个状态都可以呈现出来:
user = {
  name: "Tang",
  id: 40
}
render :json => user.to_json, :status => :ok

流行的状态码,请查看HTTP状态码和RESTful API构建

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接