ActiveRecord :: RecordNotFound,如响应处理

时间:2017-10-11 10:56:34

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord

我有一个像这样的代码示例:

def update
  if @transaction.update(transaction_params)
    render :show, status: :ok
  else
    render json: @transaction.errors, status: :unprocessable_entity
  end
end

当我尝试更新不存在的记录时,换句话说,控制器引发ActiveRecord :: RecordNotFound。我不需要拯救和渲染任何东西,因为这个异常有自己的响应处理程序或什么,这是我在上面的方法提供无效id时在响应中得到的,邮递员截图:

enter image description here

这是文字版:

{
    "status": 404,
    "error": "Not Found",
    "exception": "#<ActiveRecord::RecordNotFound: Couldn't find Transaction with 'id'=88 [WHERE \"transactions\".\"active\" = ?]>",
    "traces": {
        "Application Trace": [
            {
                "id": 6,
                "trace": "app/controllers/api/v1/transactions_controller.rb:42:in `set_transaction'"
            }
        ],
        "Framework Trace": [
            {
                "id": 0,
                "trace": "vendor/bundle/gems/activerecord-5.1.4/lib/active_record/relation/finder_methods.rb:343:in `raise_record_not_found_exception!'"
            },
            {

然而,当我添加自己的控制器类,并且我从模型中提升它时,如果我没有在控制器中专门解救它,我会得到500。

如何为ActiveRecord :: RecordNotFound完成此操作?如何为自定义错误添加响应处理程序?

1 个答案:

答案 0 :(得分:0)

我建议您在ApplicationController中使用rescue_from

class ApplicationController
  rescue_from MyOwnException do |exception|
    render 'my_error_view'
  end
end

或者您可以使用exception_app,在config/application.rb中设置如下:

config.exceptions_app = routes

然后,您可以通过路线控制错误的呈现:

match '/404', to: 'exceptions#handle_404'

您可以在此博文中找到更多详细信息:Handling errors in Ruby on Rails