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
有没有方法论相关或技术原因?
有!
该方法基于将HTTP请求方法和URL映射到CRUD的想法。
在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
为路径本身使用不同方法的唯一原因是您指向唯一路径。
这对'new_photos_path'有意义,但为什么不用'method:update'来处理HTTP动词?这是由一个表单提交?你能否更清楚需要'方法:动词'时的区别和像'edit_photos_path'这样的快捷键就足够了? – Nick
你唯一需要的方法:动词是删除。 Rails通过你如何使用它们来判断其余部分。 – hashrocket
更新了我的答案,并详细说明了可用路径。 – philnash
不,没有。这是纯粹的约定。 – jvillian