在Rails中返回JSON格式的404错误?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

我的Rails应用程序中有一个普通的HTML前端和一个JSONAPI。现在,如果有人打电话来/api/not_existent_method.json它返回默认的HTML 404页。有没有办法把这变成{"error": "not_found"}当将原来的404页保留给HTML前端时,是否完好无损?

提问于
用户回答回答于

可以编写自己的中间件,也可以将错误路由回Rails,如下所示:

# In your config/application.rb
config.exceptions_app = self.routes

那么你只需要在你的config/routes.rb:

get "/404" => "errors#not_found"
get "/500" => "errors#exception"

然后创建一个控制器来处理这个问题。

class ErrorsController < ActionController::Base
  def not_found
    if env["REQUEST_PATH"] =~ /^\/api/
      render :json => {:error => "not-found"}.to_json, :status => 404
    else
      render :text => "404 Not found", :status => 404 # You can render your own template here
    end
  end

  def exception
    if env["REQUEST_PATH"] =~ /^\/api/
      render :json => {:error => "internal-server-error"}.to_json, :status => 500
    else
      render :text => "500 Internal Server Error", :status => 500 # You can render your own template here
    end
  end
end

在开发环境中,Rails通常不会呈现404或500页,而是打印一个回溯。如果你想看你的ErrorsController在开发模式下的操作中,然后禁用您config/enviroments/development.rb档案。

config.consider_all_requests_local = false
用户回答回答于

我创建一个单独的API控制器来设置格式(Json)和特定于API的方法:

class ApiController < ApplicationController
  respond_to :json

  rescue_from ActiveRecord::RecordNotFound, with: :not_found
  # Use Mongoid::Errors::DocumentNotFound with mongoid

  def not_found
    respond_with '{"error": "not_found"}', status: :not_found
  end
end

RSpec:

  it 'should return 404' do
    get "/api/route/specific/to/your/app/", format: :json
    expect(response.status).to eq(404)
  end

扫码关注云+社区