【问题标题】:RESTful Rails Put/Post fail problemRESTful Rails Put/Post 失败问题
【发布时间】:2011-04-29 13:06:05
【问题描述】:

因此,使用 Rails 的 REST 资源路由,我们最终会得到与控制器操作协调的自动生成路由(我将避免抱怨我如何复制模型两次以及关系两次(作为模型,然后作为(通常)嵌套资源;以及两次操作(因为我在适用的情况下仅使用/例外来限制我的资源,然后仅将这些操作编码到控制器中;所以有效地我的控制器的公共方法是我的操作......无论如何,我离题了)

  • GET /resources/new --> POST /resources --> REDIRECT GET /resources/:new_id
  • GET /resources/:id/edit --> PUT /resources/:id --> REDIRECT GET /resources/:id/

让我头疼的事情是,当验证停止保存并返回渲染时:new / render :edit 但此时,客户端的 URI 未指向 .../new或 .../:id/edit 了。这似乎严重破坏了 REST 范式;因为我们还没有改变状态,我们已经转移了。也许这就是为什么我一直在努力接受非 AJAX 或 WebService 场景中的 RESTful 实践,在这些场景中,可以在不更改页面的情况下进行调用和处理。在真正的 REST 资源表示中,我们不应该指向 resources/:id/edit,而只是从 PUT 动词中推断。

在过去的 Rails 中,我们将 .../new 表单指向 new 并使用诸如 request.post 之类的有条件的控制器? .如果验证由于某种原因失败,可以不重定向到 GET,但用户仍在 .../new,这是有道理的。他们可以一遍又一遍地按下重新加载,只要我们的控制器检查了 POST 和 GET 的新操作,它就会继续出错,或者重新加载空白表单。成功后,我们将继续使用 Get/Post/Get 模式。

所以,关于如何处理资源位置切换以及失败时,现在显示“新' 基于 URI(并结合 Rails 的 .../new || .../edit 范例)应该是 'show' 或 'index' 的形式?

(第二个问题:如果练习真正的 REST,我们应该/可以如何处理在 POST 或 PUT 之前获取有关资源的信息,因为没有模式的广播合同,就像 SOAP 一样,它吹嘘自己很棒。换句话说,为了避免诸如 .../edit 和 .../new 之类的“黑客行为”(如果在 REST 方法中列出 URI 中的其他动词 .../show, .. ./delete 等,因为 URI 中动词的存在减少了它作为资源而不是 object.method 对的方面)

【问题讨论】:

    标签: ruby-on-rails rest redirect resources routing


    【解决方案1】:

    如果您真的希望 URL 保持不变,您始终可以实现客户端验证并禁用“创建”或“更新”按钮;这意味着您可以跳过 if-else 循环并在保存仍然失败时抛出错误。

    如果您查看默认的 Rails XML 路由,它通常甚至没有新的和编辑方法,而只是返回带有生成错误的 XML。这实际上与 HTML 相同,只是 Rails 会优雅地处理它并允许用户立即重试。

    当然,如果你真的想摆脱 /new 和 /edit 'hacks'(正如你所说的那样),你可以在 index 视图中包含一个 'new' 表单并包含编辑资源的能力在同一资源的显示视图上。

    另一个改进是在 create 和 update 方法中的 else 上返回 422 (:unprocessable_entity) 而不是 200;这通常是为 XML 输出实现的,但大多不是为 HTML 输出实现的。然后,您至少会向客户表明它提供的输入无效。

    【讨论】:

      猜你喜欢
      • 2013-05-25
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-21
      • 2013-10-30
      • 1970-01-01
      • 2015-05-17
      相关资源
      最近更新 更多