【问题标题】:Refactoring duplicate rescue exception handlers in Ruby on Rails controller在 Ruby on Rails 控制器中重构重复的救援异常处理程序
【发布时间】:2019-03-28 19:40:03
【问题描述】:

我在控制器中有两个操作方法,它们具有相同的重复代码,可以挽救两种不同类型的异常:

      def wave
        ...do something here...
      rescue ActionController::ParameterMissing => e
        render :json => {:error => e.message}, :status => 422
      rescue Vendor::ApiError => e
        render :json => {:error => e.message}, :status => 500
      end

      def run
        ...do something different here...
      rescue ActionController::ParameterMissing => e
        render :json => {:error => e.message}, :status => 422
      rescue Vendor::ApiError => e
        render :json => {:error => e.message}, :status => 500
      end

是否可以将救援处理程序重构为一个公共私有方法,并从 runwave 方法中调用?

【问题讨论】:

    标签: ruby-on-rails ruby exception-handling refactoring


    【解决方案1】:

    您可以在控制器中使用rescue_from 来避免所有控制器操作中的错误。你会有这样的东西

    class MyController < ApplicationController
      rescue_from ActionController::ParameterMissing do |exception|
        render :json => {:error => exception.message}, :status => 422
      end
    
      rescue_from Vendor::ApiError do |exception|
        render :json => {:error => exception.message}, :status => 500
      end
    
      def wave
        # ...
      end
    
      # ...
    end
    

    如果您希望在所有控制器上都具有此行为,您甚至可以将其放入您的应用程序控制器中(例如,可能有助于挽救 ParameterMissing 错误)

    【讨论】:

      【解决方案2】:

      你可以试试这样的:

      def wave
        error_handler do
          # ...do something here...
        end
      end
      
      def run
        error_handler do
          # ...do something different here...
        end
      end
      
      def error_handler
        yield
      rescue ActionController::ParameterMissing => e
        render :json => {:error => e.message}, :status => 422
      rescue Vendor::ApiError => e
        render :json => {:error => e.message}, :status => 500
      end
      

      编辑:不过,这只是从普通 ruby​​ 的角度来看,也许 rails 已经有了更好的东西。

      【讨论】:

      • 这看起来是一种更简洁优雅的减少代码重复的方法,谢谢!
      • 这要好得多,也可以在控制器(模块、API 等)之外使用
      猜你喜欢
      • 2023-01-13
      • 2020-08-26
      • 2012-04-15
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      相关资源
      最近更新 更多