“更新”的“Rails方式”从根本上是有缺陷的吗?

时间:2012-02-14 16:52:05

标签: ruby-on-rails routing crud

我故意以煽动性的方式提出这个问题,因为我担心自己会遗漏某些东西。

用于处理模型更新的 Rails Way 如下:

class UsersController < ApplicationController
  ...
  def update
    @current_user = load_user
    if @current_user.update_attributes params[:user]
      redirect_to success_path
    else
      render :edit
    end
  end
end

这一切都很好,除非你在表单提交不正确时最终得到一个奇怪的URL:

编辑用户

你发现自己在路上:

users/:user_id/edit

提交无效验证后的修改

即。您将需要修复表单中的输入并重新提交:

users/:user_id

提交完成验证的修改后

success_path

为什么你因为表单有错误而应该使用其他网址?


问题......

您正在做同样的事情,但现在您使用的是其他网址。这有点奇怪。

事实上坦率地说,这感觉不对。您正在使用未正确验证的表单,因此已重新加载。你应该还在/users/:user_id/edit。如果你已经完成了JS验证,那就是。

此外,如果你的导航中有任何“当前选择”的逻辑,那么你实际上在视觉上是错误的,因为正确的导航项目不再突出显示 - 它看起来像你在用户个人资料页。

2 个答案:

答案 0 :(得分:6)

  

为什么你应该只是因为表格而在不同的URL上   有错误吗?

因为当你第一次去:

users/:user_id/edit

......你要求获得GET。

然后你发帖到:

users/:user_id

因此,通过发送表单帖子,您已经请求了不同的资源路由,并且根据定义具有不同的URL。

框架并不关心你的请求处理过程中后台发生了什么 - 它只知道它是一个POST(根据惯例,它不一定是幂等的GET)

答案 1 :(得分:0)

实际上它不是“Rails Way”,而是“REST Way”。维基百科:Representational state transfer

如果您遵守这些规则,您将免费获得符合REST标准的Web服务。据我所知,路径“resource / id / edit”特定于html文档。 Web服务客户端不需要表单进行编辑。

所以这些人都试图保持一致。如果您不需要Web服务兼容性,则可以更改路由。