在 Rails 控制器上重构 Ruby 中的重复救援异常处理程序
Refactoring duplicate rescue exception handlers in Ruby on Rails controller
我在一个控制器中有两个操作方法,它们具有相同的重复代码来挽救两种不同类型的异常:
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
是否可以将救援处理程序重构为一个通用的私有方法,并从 run
和 wave
方法中调用?
您可以尝试这样的操作:
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 已经有了更好的东西。
您可以在控制器中使用 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 错误)
我在一个控制器中有两个操作方法,它们具有相同的重复代码来挽救两种不同类型的异常:
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
是否可以将救援处理程序重构为一个通用的私有方法,并从 run
和 wave
方法中调用?
您可以尝试这样的操作:
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 已经有了更好的东西。
您可以在控制器中使用 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 错误)