【发布时间】: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