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 的应用程序,我认为这是传递有价值的信息。

更多信息: