【问题标题】:ActiveRecord::RecordNotFound like response handlingActiveRecord::RecordNotFound 类似响应处理
【发布时间】:2018-03-23 00:36:40
【问题描述】:

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

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

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

这里是文字版:

{
    "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 完成这项工作?如何为我的自定义错误添加响应处理程序?

【问题讨论】:

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


    【解决方案1】:

    我建议你在 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      • 1970-01-01
      • 2018-01-30
      相关资源
      最近更新 更多