Rails 5 种处理方式 ActionController::ParameterMissing
Rails 5 way to handle ActionController::ParameterMissing
如果使用强参数缺少所需的参数,Rails 服务器将使用 HTTP 500 进行响应。
这并不能让我控制向用户反馈到底出了什么问题。能够向他们发回缺少必需参数的消息没有意义吗?
在 ActionController::ParameterMissing
上给予适当的用户反馈的 "Rails way" 是什么?是否应该捕获异常并在那里处理您的请求响应?在每个控制器中这样做似乎是错误的。
您可以使用
rescue_from ActionController::ParameterMissing do |e|
render 'something'
end
在您的 ApplicationController
(或任何您的父控制器)中。
至于是否应该通知用户,我认为这取决于您的控制器在做什么。如果他们是 API 控制器,那么优雅地处理它绝对有意义,因为用户负责准备输入。
如果他们接受来自您的 HTML 表单的数据,在我看来,这并不重要,因为缺少参数可能意味着用户修改了 HTML,或者浏览器内部确实出了问题。
由于您提到要将错误细节反馈给用户,您可以执行以下操作:
# app/controllers/application_controller.rb
rescue_from ActionController::ParameterMissing do |exception|
render json: { error: exception.message }, status: :bad_request
end
如果您希望分解处理逻辑,您还可以定义一个方法来处理特定的异常:
# app/controllers/application_controller.rb
rescue_from ActionController::ParameterMissing, with: :handle_parameter_missing
def handle_parameter_missing(exception)
render json: { error: exception.message }, status: :bad_request
end
以上两个例子都会 return 一个 JSON 响应,如下所示:{"error"=>"param is missing or the value is empty: [field_name]"}
对于仅 API 的应用程序,我认为这是传递有价值的信息。
更多信息:
如果使用强参数缺少所需的参数,Rails 服务器将使用 HTTP 500 进行响应。
这并不能让我控制向用户反馈到底出了什么问题。能够向他们发回缺少必需参数的消息没有意义吗?
在 ActionController::ParameterMissing
上给予适当的用户反馈的 "Rails way" 是什么?是否应该捕获异常并在那里处理您的请求响应?在每个控制器中这样做似乎是错误的。
您可以使用
rescue_from ActionController::ParameterMissing do |e|
render 'something'
end
在您的 ApplicationController
(或任何您的父控制器)中。
至于是否应该通知用户,我认为这取决于您的控制器在做什么。如果他们是 API 控制器,那么优雅地处理它绝对有意义,因为用户负责准备输入。 如果他们接受来自您的 HTML 表单的数据,在我看来,这并不重要,因为缺少参数可能意味着用户修改了 HTML,或者浏览器内部确实出了问题。
由于您提到要将错误细节反馈给用户,您可以执行以下操作:
# app/controllers/application_controller.rb
rescue_from ActionController::ParameterMissing do |exception|
render json: { error: exception.message }, status: :bad_request
end
如果您希望分解处理逻辑,您还可以定义一个方法来处理特定的异常:
# app/controllers/application_controller.rb
rescue_from ActionController::ParameterMissing, with: :handle_parameter_missing
def handle_parameter_missing(exception)
render json: { error: exception.message }, status: :bad_request
end
以上两个例子都会 return 一个 JSON 响应,如下所示:{"error"=>"param is missing or the value is empty: [field_name]"}
对于仅 API 的应用程序,我认为这是传递有价值的信息。
更多信息: