如何在 rails 中保持 CRUD 和 RESTFull(具体示例)

How to keep it CRUD and RESTFull in rails (concrete example)

我很难让我的控制器不要太复杂,并且在我们搭建脚手架时 rails 创建基本操作。

谁能告诉我下面的方法是否正确。

我有一个模型 Project 以及它的那些基本路线:

GET   /projects            ->   Project#index
GET   /projects/new        ->   Project#new
POST  /projects            ->   Project#create
GET   /projects/:id        ->   Project#show
GET   /projects/:id/edit   ->   Project#edit
PATCH /projects/:id        ->   Project#update
PUT   /projects/:id        ->   Project#update

现在我想让用户接受项目。首先,他有一个摘要视图,他可以在其中按下一个按钮,它应该会更改模型中的一些值。

我的第一次尝试是

GET   /projects/:id/accept ->   Project#accept
POST  /projects/:id/accept ->   Project#accept_update

这感觉不对。

所以我想知道我是否应该这样做:

GET   /projects/:id/accept ->   Acceptations#new
POST  /projects/:id/accept ->   Acceptations#create

但是,我的接受控制器正在处理 Project 模型。什么开始让我感到困惑。

最重要的是,如果我选择第二个选项,路径应该是 /projects/:id/acceptations/new 这对最终用户来说似乎很长而且令人困惑。

有一种约定(有时称为 "heroku REST style")将这些 "extra" 方法作为 "actions" 放在主要资源下。

所以你会得到这个来接受项目。

 POST /projects/:id/actions/accept

从 REST 的角度来看,此路由解析的内容无关紧要。可能是 ProjectsController 中的一个动作。我可能会为此操作创建一个专用控制器,controllers/projects/actions/accept_controller.rb

至于new路线,jsonapi不需要。如果是 GUI(例如您的网站),您可能也不需要单独的页面。相反,它只是一个小表格,在项目显示页面的某处带有 "accept" 按钮。