2017-06-19 96 views
0

我正在瀏覽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

回答

2

有!

該方法基於將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

相關問題