Rails 5处理ActionController :: ParameterMissing的方式

时间:2018-09-27 19:24:46

标签: ruby-on-rails strong-parameters

如果使用强参数缺少必需的参数,则Rails服务器将使用HTTP 500进行响应。

这不能控制我向用户提供确切问题的反馈。能够向他们发回消息,缺少必需的参数,这没有意义吗?

ActionController::ParameterMissing上提供适当的用户反馈的“路线”是什么?是否应该捕获异常并在那里处理您的请求响应?在每个控制器中这样做似乎是错误的。

2 个答案:

答案 0 :(得分:1)

您可以使用

rescue_from ActionController::ParameterMissing do |e|
  render 'something'
end

在您的ApplicationController中(或您的父控制器是什么)。

关于您是否应该通知用户,我认为这取决于您的控制器在做什么。如果它们是API控制器,那么一定要优雅地处理它,因为用户负责准备输入。 我认为,如果他们从您的HTML表单中接受数据,那么它就不那么重要了,因为缺少参数可能意味着用户修改了HTML,或者浏览器内部出现了某些错误。

答案 1 :(得分:0)

由于您提到希望将错误详细信息传达回用户,因此您可以执行以下操作:

# 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

以上两个示例都将返回JSON响应,例如:{"error"=>"param is missing or the value is empty: [field_name]"}

对于仅API的应用程序,我认为这是有价值的信息。

更多信息: