Rails:为什么create/update action 和index action 指向同一个URL?

Rails: Why does create/update action point to the same URL like the index action?

当创建或更新资源时,目标 URL 默认情况下与索引路由相同,对于用户,例如localhost:3000/users.

不同之处在于,使用 PUT 方法而不是 POST(据我所知)。

我觉得这不是最理想的。例如,当导航菜单中有一个项目 "Create user" 时,我想在该项目处于活动状态时设置 active CSS class 。我通过比较 current_page? 和菜单项的 URL(例如 users/new)来做到这一点。这工作正常,但只有当我没有验证错误时。在这种情况下,URL 现在不再是 users/new,而是 users.

Rails 没有针对 POST/PUT 请求分别指向 users/new(或 users/edit)是否有充分的理由?使用它们有什么缺点吗?有没有简单的方法可以改变这种行为?

原因是REST.

简而言之,Rails 将所有内容都视为一种资源,并且为此遵循一些约定。在典型的 CRUD 应用程序中,您有创建 (POST)、读取 (GET)、更新 (PUT/PATCH) 和销毁 (DELETE) 操作,这些操作是用于对资源进行操作的动词。

假设您有一个用户资源。可以在 /users 找到用户列表。然后将在 /users/1 处找到作为资源的单个对象的单个用户,其中“1”是相关资源的标识符。

现在,根据您可用的 CRUD 动词,如果您想编辑用户,考虑到我们讨论的 CRUD 动词,什么 ACTION 最有意义? PUT /users/1 是正确答案;您正在更新(CRUD 中的 U)特定资源。如果你想删除那个用户?删除 /users/1 是有道理的。如果你想创建一个? CREATE /users 是合乎逻辑的选择,因为您不是对特定对象进行操作,而是对整个资源进行操作,类似于 GET /users 不是对单个对象进行操作,而是对集合进行操作。

/users/new 是允许您执行此操作的页面路径,但这并不意味着它应该向 /users/new 发出 CREATE 请求,因为 "new" 不会不要以相同的方式描述资源。