【问题标题】:Should I end a controller's action the instant a problem is found in a request?我应该在请求中发现问题的那一刻结束控制器的操作吗?
【发布时间】:2011-07-18 20:11:20
【问题描述】:

我想知道这种情况的最佳做法是什么:

我有一个客户端,它通过 POST 向我的 Web 应用程序中的 /register 服务注册客户。该请求可以包括 N 个客户要注册的程序,例如:

{
    customer_id: 123,
    program_ids: [ 1, 2, 3 ]
}

现在,其中一些程序可能无法供用户注册,即它们已关闭。

我想知道在这种情况下,我应该在服务器上使用控制器的请求验证代码做什么?

我认为我的选择是:

  1. 允许控制器提交客户可以注册的任何有效程序到数据库,因为它通过数组中的程序,然后向客户端响应错误,说明某些东西有效,但不是所有的东西.

  2. 首先验证请求并确保所有程序都可供客户注册。一旦发现一个坏的,控制器应该停止运行并用一个错误的请求响应客户端。

最后,如果我应该使用选项 2,我如何停止处理控制器方法中的所有内容,而只响应错误请求?

【问题讨论】:

    标签: ruby-on-rails model-view-controller ruby-on-rails-3 rest


    【解决方案1】:

    在我看来,选项 1 会导致最少的用户头痛。从用户的角度考虑:在一个应用程序上检查多个选项,然后收到错误是特别烦人的,因为我的一个选择由于某种原因而无效,这会阻止所有其他有效的操作通过.

    就我个人而言,我认为最好允许任何有效的操作通过,如果出现问题,请在单独的数组中跟踪它(如 Sam 所述),然后给用户一个通知功能区或其他东西上面写着“嘿,我为您注册了这些程序,但我无法为您注册所有这些程序。单击此处了解更多信息”,然后可能会弹出一个模式弹出窗口,告诉用户哪些程序失败了什么原因。

    【讨论】:

      【解决方案2】:
      1. 如果无效数据可能来自诚实的错误,请使用选项一:执行可以执行的内容,然后显示错误消息。

      2. 如果无效数据来自恶意行为(参数伪造等),请使用选项二。要停止处理控制器方法中的所有内容,只需引发错误,您可以选择使用 rescue_from

      3. 来处理该错误

      【讨论】:

        【解决方案3】:

        我还没有这样做,但很快就会进行一些移动开发,这就是我计划的处理方式:

        如果您正在处理来自移动应用或其他什么的多个帖子条目,我认为最好的做法是选项 2 并创建两个哈希/数组,一个成功一个失败。

        然后你可以返回 json 或任何你需要的返回到不同服务的两个数组,一个通过,一个失败。

        【讨论】:

          【解决方案4】:

          您提出的两个选项之间的选择应归结为用户要求和用户体验,而不是技术考虑。在您考虑的情况下,该服务的用户是部分注册更好,还是同时完成所有注册更重要?

          在技术实现方面,对于选项 2,您可能需要研究 custom validations 和 nested attributes 等内容。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-10-16
            • 1970-01-01
            • 1970-01-01
            • 2015-01-21
            相关资源
            最近更新 更多