Rails:没有CRUD删除快捷方式的路径?

问题描述:

我正在浏览Rails "Getting Started"指南,并注意到与快捷方式似乎不一致的地方。请看下面的代码:Rails:没有CRUD删除快捷方式的路径?

<% @articles.each do |article| %> 
<tr> 
    <td><%= article.title %></td> 
    <td><%= article.text %></td> 
    <td><%= link_to 'Show', article_path(article) %></td> 
    <td><%= link_to 'Edit', edit_article_path(article) %></td> 
    <td><%= link_to 'Destroy', article_path(article), 
    method: :delete, data: { confirm: 'Are you sure?' } %></td> 
</tr> 

我们有一个article_path快捷方式显示,并edit_article_path快捷的CRUD更新。但是,语法更改并删除,我们必须将method: :delete添加到显示路径。

为什么没有delete_article_path有没有方法论相关或技术原因?

+1

不,没有。这是纯粹的约定。 – jvillian

有!

该方法基于将HTTP请求方法和URL映射到CRUD的想法。

The Rails guides say

在Rails中,一个资源丰富的路由提供HTTP动词和网址控制器动作之间的映射。按照惯例,每个动作也映射到数据库中的特定CRUD操作。在路由文件中的一个条目,如:

resources :photos 

创建应用程序中的七个不同的路线,都映射到照片控制器:

HTTP Verb  Path    Controller#Action Used for 
GET   /photos   photos#index   display a list of all photos 
GET   /photos/new  photos#new   return an HTML form for creating a new photo 
POST   /photos   photos#create  create a new photo 
GET   /photos/:id  photos#show   display a specific photo 
GET   /photos/:id/edit photos#edit   return an HTML form for editing a photo 
PATCH/PUT  /photos/:id  photos#update  update a specific photo 
DELETE  /photos/:id  photos#destroy  delete a specific photo 

由于路由器使用HTTP动词和网址匹配入站请求,四个URL映射到七个不同的动作。

因此Rails使用HTTP动词和URL来匹配请求。没有任何约定意味着要查看资源来编辑它的HTTP动词,所以我们得到edit_article_path(article)。然而,对于其他操作,如显示,销毁和更新,相同的URL用于不同的HTTP动词(GET,DELETE和PATCH/PUT)。

[编辑]

只有需要使用时路径动词中复制的method: :verb格式。使用文档/photos(GET和POST)和/photos/:id(GET,PATCH/PUT和DELETE)的照片示例,默认资源路径的重复路径为。

这些路径的使用也往往意味着他们的动词。因此,当您创建指向photos_path/photos)或photo_path/photos/:id)的链接时,链接隐式为GET,因此将返回GET表单。另一方面,如果您有一个没有ID的@photo对象并在表单中使用它,则隐式地是一个POST来创建该对象。如果在表单中有一个带有ID的@photo对象,那么您可能会更新它,因此动词是PATCH。

正如@hashrocket在评论中所说的,唯一真正的非隐式使用是创建销毁链接,并且您必须指出链接不仅仅是应该获取资源,而是删除它。

最后,每个单独的路径都有一个方法,因此您需要提供动词来消除歧义。方法是:

Path method  Path 
photos_path  /photos 
new_photos_path /photos/new 
photo_path  /photos/:id 
edit_photo_path /photos/:id/edit 

为路径本身使用不同方法的唯一原因是您指向唯一路径。

+0

这对'new_photos_path'有意义,但为什么不用'method:update'来处理HTTP动词?这是由一个表单提交?你能否更清楚需要'方法:动词'时的区别和像'edit_photos_path'这样的快捷键就足够了? – Nick

+0

你唯一需要的方法:动词是删除。 Rails通过你如何使用它们来判断其余部分。 – hashrocket

+0

更新了我的答案,并详细说明了可用路径。 – philnash