【问题标题】:Should exceptions raised due to missing params be rescued?是否应该挽救因缺少参数而引发的异常?
【发布时间】:2016-11-09 03:16:33
【问题描述】:

是否应该挽救因缺少参数而引发的异常?

例如在FriendRequestsController中的以下代码:

def update
  @request = FriendRequest.find(params[:id])

  if @request.update(friend_request_params)
    flash[:notice] = "Friend request updated successfully."
    redirect_to current_user
  else
    flash[:errors] = @request.errors.full_messages
    redirect_to current_user
  end
end

private
  def friend_request_params
    params.require(:friend_request).permit(:status)
  end

如果对模型的更新调用失败,错误消息将存储在flash 中。但是,如果params 出现问题,导致在friend_request_params 辅助方法中引发异常,则应用程序将失败。

这是允许这样做的约定吗?有没有更好的方法来做到这一点?

【问题讨论】:

    标签: ruby-on-rails ruby exception parameters rescue


    【解决方案1】:

    不,他们不应该。如果您的参数发生异常,那是因为发生了一些奇怪或意外的事情。它可能是一个错误,也可能是有人弄乱了表单。如果friend_request_params 引发异常,只需向您的用户显示一个漂亮的网页,例如 public/500.html 或 public/400.html。

    您可以查看日志以跟踪异常,或使用rescue_from 以更方便的方式实现全部捕获以记录它们。

    【讨论】:

    • 非常感谢您的回答。我选择了另一个答案,因为我认为它的措辞要好一些。
    【解决方案2】:

    简而言之,答案是否定的。当你打电话时

      def friend_request_params
        params.require(:friend_request).permit(:status)
      end
    

    您已与使用friend_request_params 的任何操作建立了合同。如果该操作调用friend_request_params 并且未发送:friend_request,则该操作违反了合同,应引发异常。你的应用程序没有按设计正常运行,可以说你在煤矿里的金丝雀是个例外。

    【讨论】:

      猜你喜欢
      • 2013-01-18
      • 1970-01-01
      • 2022-08-11
      • 1970-01-01
      • 1970-01-01
      • 2020-01-05
      • 1970-01-01
      • 2020-06-11
      • 2011-11-18
      相关资源
      最近更新 更多