【问题标题】:Rails 5 way to handle ActionController::ParameterMissingRails 5 处理 ActionController::ParameterMissing 的方法
【发布时间】:2019-03-03 18:33:12
【问题描述】:

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

这并不能让我控制向用户反馈究竟出了什么问题。能够向他们发回缺少所需参数的消息是否没有意义?

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

【问题讨论】:

    标签: ruby-on-rails strong-parameters


    【解决方案1】:

    你可以使用

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

    在您的ApplicationController(或任何您的父控制器)中。

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

    【讨论】:

      【解决方案2】:

      由于您提到希望将错误细节传达给用户,您可以执行以下操作:

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

      更多信息:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-02
        • 1970-01-01
        • 2017-11-13
        相关资源
        最近更新 更多